SQL MERGE INSERT INTO不起作用

时间:2018-07-12 11:12:17

标签: sql sql-server tsql merge

我在使用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)

2 个答案:

答案 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)的示例都将其插入到为描述该动作的字符串设计的列中。