SQL Server Merge - 输出返回null已删除的行作为插入

时间:2014-09-11 21:04:14

标签: sql sql-server sql-merge

我正在使用MERGE来同步表中的数据,而我从SQL Server中看到了一些错误(对我而言)的行为。当我OUTPUT INSERTED.*值并删除了一行时,MERGE命令会返回一行,其中包含已删除的每一行的所有NULL列。

例如,采用此架构:

CREATE TABLE tbl
(
    col1 INT NOT NULL,
    col2 INT NOT NULL
);

我初始加载数据,并按预期输出所有4行。

WITH data1 AS (
SELECT 1 [col1],1 [col2]
UNION ALL SELECT 2 [col1],2 [col2]
UNION ALL SELECT 3 [col1],3 [col2]
UNION ALL SELECT 4 [col1],4 [col2]
)
MERGE tbl t
USING data1 s
ON t.col1 = s.col1 AND t.col2 = s.col2
WHEN NOT MATCHED BY TARGET
    THEN INSERT (col1,col2) VALUES (s.col1,s.col2)
WHEN NOT MATCHED BY SOURCE
    THEN DELETE
OUTPUT INSERTED.*;

现在,假设我从数据表中删除了2行(在我的CTE中)并执行相同的MERGE,我看到返回的所有NULL列中有2行。 / p>

WITH data1 as (
SELECT 1 [col1],1 [col2]
UNION ALL SELECT 2 [col1],2 [col2]
)
MERGE tbl t
USING data1 s
ON t.col1 = s.col1 AND t.col2 = s.col2
WHEN NOT MATCHED BY TARGET
    THEN INSERT (col1,col2) VALUES (s.col1,s.col2)
WHEN NOT MATCHED BY SOURCE
    THEN DELETE
OUTPUT INSERTED.*;

对我而言,这似乎是错误的行为,因为A)我没有任何已删除的行和B)这使得我似乎将这两个NULL行插入到我的表中,我显然没有。任何人都可以了解正在发生的事情吗?

1 个答案:

答案 0 :(得分:0)

来自documentation

  

output_clause - 返回target_table中每一行的行   更新,插入或删除,没有特定的顺序。 $ action可以   在输出子句中指定。 $ action是一个类型的列   nvarchar(10)返回每行的三个值之一:' INSERT',   根据执行的操作,更新'或者删除'   那一行。

似乎SQL Server为每个更改的行输出一行(通过插入或删除)。当我指定OUTPUT INSERTED.*时,我实际上只指定了插入的数据,对于已更改的2行,该数据为空。如果我指定OUTPUT INSERTED.col1 [InsCol1],INSERTED.col2 [InsCol2],DELETED.col1 [DelCol1],DELETED.col2 [DelCol2],$action,那么我可以更好地了解发生了什么。

感谢劳伦斯的评论。