0

我正在使用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 行。

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行插入到我的表中,而我显然没有。任何人都可以对正在发生的事情有所了解吗?

4

1 回答 1

0

文档中:

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

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

感谢劳伦斯的评论。

于 2014-09-11T21:48:47.870 回答