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