创建合并过程时,SQL Server 2014中出现“无效的列名”错误

时间:2018-12-17 20:53:45

标签: sql sql-server

我正在尝试使用多列创建一个merge过程。但是,我也遇到了有关列名的多个错误。

enter image description here

我希望能指出我要去哪里的错误。


create PROCEDURE [Etl].[MergeRPIData2] AS

SET NOCOUNT ON

MERGE [RetailPrice].[RetailPriceIndex] AS Trgt
USING (SELECT ItemId, Outlet, DataYear, DataMonth
    FROM [RetailPrice].[StagingRPI]) AS Src (ItemId, Outlet, DataYear, DataMonth)
    ON Trgt.ItemId=Src.ItemId AND Trgt.Outlet=Src.Outlet AND Trgt.DataYear=Src.DataYear AND Trgt.DataMonth=Src.DataMonth

WHEN MATCHED THEN 
    UPDATE SET ID=Src.ID, ItemId=Src.ItemId, Item=Src.Item, RPIType=Src.RPIType, Outlet=Src.Outlet, RPIWeight=Src.RPIWeight, PrevMonth=Src.PrevMonth, 
            CurrMonth=Src.CurrMonth, Remarks=Src.Remarks, DataYear=Src.DataYear, DataMonth=Src.DataMonth

WHEN NOT MATCHED BY TARGET THEN
    INSERT (ID, ItemId, Item, RPIType, Outlet, RPIWeight, PrevMonth, CurrMonth, Remarks, DataYear, DataMonth)
    VALUES (Src.[ID], Src.[ItemId], Src.[Item], Src.[RPIType], Src.[Outlet], Src.[RPIWeight], Src.[PrevMonth], Src.[CurrMonth], Src.[Remarks], Src.[DataYear], Src.[DataMonth])

WHEN NOT MATCHED BY SOURCE THEN 
    DELETE;

DELETE FROM [RetailPrice].[StagingRPI]

1 个答案:

答案 0 :(得分:1)

在图片上读取SQL并不容易...但是,令我震惊的一件事是,您的WHEN MATCHEDWHEN ǸOT MATCHED子句引用了Src中的许多实际上并不实际的列由Src子查询返回。

Src返回4列:

  • ItemId
  • 插座
  • DateYear
  • DataMonth

同时,WHEN (NOT) MATCH子句引用以下字段(缺少的字段表示为粗体):

  • ID
  • ItemId
  • 项目
  • RPIType
  • 插座
  • RPIWeight
  • 上一个月
  • CurMonth
  • 备注
  • DataYear
  • DataMonth

我想象[RetailPrice].[StagingRPI]所基于的Src表中实际上所有缺失字段都是可用的(如果没有,则说明您存在严重的设计问题)。

要解决查询生成的多个无效列名错误,您需要调整Src子查询,以便它返回所有需要的字段。我无法为您生成正确的查询,因为您没有将原始查询发布为文本。