我在使用SQL的MERGE语句时遇到麻烦。我尝试按照Microsoft的指南进行操作,但没有成功。
我希望代码更新找到的所有匹配行,并将不匹配的行插入到另一个表中。
我一直在使用以下代码:
CREATE TABLE dbo.NotMatched
(ID INT , Year INT, Month INT, Quantity INT,
CONSTRAINT PK_Matched PRIMARY KEY CLUSTERED (ID));
GO
CREATE TABLE dbo.Updated
(ID INT , Year INT, Month INT, Quantity INT,
CONSTRAINT PK_Updated PRIMARY KEY CLUSTERED (ID));
GO
CREATE TABLE dbo.Staging
(ID INT , Year INT, Month INT, Quantity INT,
CONSTRAINT PK_Staging PRIMARY KEY CLUSTERED (ID));
GO
MERGE INTO dbo.Updated AS Target
USING (SELECT ID, Year, Month, Quantity
FROM dbo.Staging AS stg) AS Source (ID, Year, Month, Quantity)
ON Target.ID = Source.ID
WHEN MATCHED THEN
UPDATE SET Target.Year = Source.Year, Target.Month = Source.Month,
Target.Quantity = Source.Quantity
WHEN NOT MATCHED BY TARGET THEN
INSERT (ID, Year, Month, Quantity) VALUES (Source.ID, Source.Year, Source.Month, Source.Quantity)
OUTPUT $action INTO dbo.NotMatched (ID, Year, Month, Quantity);
运行代码时,出现以下错误:
INSERT语句的选择列表包含的项目少于插入列表。 SELECT值的数量必须与INSERT列的数量匹配。
如果有人可以为我提供一些帮助,我将看不到任何明显的错误。
关于, 克里斯(Kriss)
答案 0 :(得分:0)
$action
吗?这是做什么的?
应该是
OUTPUT inserted.ID, inserted.Year, inserted.Month, inserted.Quantity
INTO dbo.NotMatched (ID, Year, Month, Quantity);
答案 1 :(得分:0)
您从MSDN文档中的注释中引用:
FILES
因此,这一行:
$action is a column of type nvarchar(10) that returns one of three values for each row: 'INSERT', 'UPDATE', or 'DELETE', according to the action that was performed on that row.
是不正确的,因为它只有一个OUTPUT $action INTO dbo.NotMatched (ID, Year, Month, Quantity);
输入,但是您试图插入四列。
在每种情况下,使用nvarchar(10)
的示例都将其插入到为描述该动作的字符串设计的列中。