【问题标题】:T-SQL MERGE unchanged targetT-SQL MERGE 目标不变
【发布时间】:2016-06-27 13:56:36
【问题描述】:

我将这种格式用于 MERGE 子句:

DECLARE @Table (ColA int, ColB int, ID int)

INSERT @Table
SELECT changes.ColA,changes.ColB,Changes.Identity
FROM
(
  MERGE Target
  USING @SourceTable SOURCE
  ON Target.ID=Source.ID
  WHEN MATCHED AND target.ColA<>soruce.ColA or target.ColB<>source.ColB THEN 
    UPDATE SET
      Target.ColA=source.ColA,
      Target.ColB=source.ColB
  WHEN NOT MATCHED BY TARGET
    INSERT(ColA,ColB)
    VALUES(Source.ColA,Source.ColB)
  WHEN NOT MATCHED BY SOURCE THEN
    DELETE
  OUTPUT INSERTED.ColA,INSERTED.ColB,SOURCE.Identity
) AS changes(ColA,ColB,SOURCE.Identity)

然后,我稍后会使用@Table 作为其他 JOINS 的来源。如果没有对 TARGET 表的插入/更新,则 @Table 为空,这会导致整个查询的其余部分出现问题,因为没有任何东西可以加入。

有没有办法捕获SOURCE 行,即使它们没有在TARGET 端进行操作?

我需要使用 MERGE 来检索 INSERT/UPDATES 上的标识列。

【问题讨论】:

  • 使用@SourceTable 本身或@Table UNION @SourceTable 用于@Table 中不存在的行。

标签: sql-server merge


【解决方案1】:
  1. 最好将IF @@ROWCOUNT &gt; 0 条件添加到脚本的其余部分,并在没有更新记录时跳过它。

  2. 1234563您的MERGE 语句中没有数据是来自Target 表的OUTPUT。 1234563 :

DECLARE @Table (ColA int, ColB int, ID int)
INSERT @Table
SELECT changes.ColA,changes.ColB,Changes.Identity
FROM (MERGE Target
USING (SELECT * FROM @SourceTable ) SOURCE
ON Target.ID=Source.ID
WHEN MATCHED /* AND target.ColA<>soruce.ColA or target.ColB<>source.ColB             */
             /* Remove condition and update even when no value would actually change */
THEN UPDATE SET Target.ColA=source.ColA,Target.ColB=source.ColB
WHEN NOT MATCHED BY TARGET INSERT(ColA,ColB) VALUES(Source.ColA,Source.ColB)
WHEN NOT MATCHED BY SOURCE THEN DELETE
OUTPUT INSERTED.ColA,INSERTED.ColB,SOURCE.Identity) AS changes(ColA,ColB,SOURCE.Identity)

【讨论】:

    【解决方案2】:

    您可以通过捕获合并语句的OUTPUT 来捕获未修改的源记录。您需要引入一个虚拟更新:

    DECLARE @dummy INT = 0;
    MERGE ...
      WHEN MATCHED THEN 
        UPDATE @dummy = @dummy
    ...
      OUTPUT INSERTED.ColA,INSERTED.ColB,SOURCE.Identity
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2014-02-20
      • 2016-02-13
      • 1970-01-01
      • 2023-03-31
      • 2011-02-27
      相关资源
      最近更新 更多