【问题标题】:SQL Server Merge - Output returning null deleted rows as insertedSQL Server 合并 - 输出返回已插入的空删除行
【发布时间】:2014-09-11 21:04:14
【问题描述】:

我正在使用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) 这看起来像是我将这 2 个 NULL 行插入到我的表中,而我显然没有这样做。任何人都可以了解正在发生的事情吗?

【问题讨论】:

  • 在输出子句中使用$action来区分。
  • @Laurence 对,但问题是为什么当我只指定插入时,SQL Server 首先输出删除。
  • 来自手册“output_clause:为 target_table 中更新、插入或删除的每一行返回一行,没有特定的顺序”。它不是很直观,但它确实做到了。 msdn.microsoft.com/en-us/library/bb510625.aspx。要了解原因,请考虑您可以说OUTPUT deleted.*, $action, inserted.col1 as x, inserted.col2 as y
  • @Laurence 所以他们基本上为每次更改(ins/up/del)输出一行,因为我只选择插入的列,所以它们为空。你是对的,它是有道理的,但它不是很直观。

标签: sql sql-server sql-merge


【解决方案1】:

来自documentation

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,那么我可以更好地了解正在发生的事情。

感谢劳伦斯的评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-25
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多