【问题标题】:SQL MERGE only when changed仅在更改时才进行 SQL MERGE
【发布时间】:2020-01-24 17:37:46
【问题描述】:

在 SQL MERGE 上,如何插入“什么都不做”类型的语句?例如,我现在有这个:

MERGE INTO dbo.Worker AS T
USING dbo.Collector_Worker AS S
ON T.WWID = S.WWID 
WHEN MATCHED THEN UPDATE SET
    T.IDSID = S.IDSID,
    ...
WHEN NOT MATCHED THEN
    INSERT (WWID, IDSID, ...)
    VALUES (S.WWID, S.IDSID, ...)
WHEN NOT MATCHED BY SOURCE THEN
     UPDATE SET T.Person_Status_Type = 'INACTIVE', T.Active = 0;

... 字符所在的其他列还有很多。所以这很好用,除了它更新已经存在的每一行,即使没有变化。由于该表中有一百万行,因此需要进行大量不必要的修改。如果进行了更改,我只想更新该行。

如果我尝试在ON 语句中添加一个AND T.IDSID <> S.IDSID,那么它将失败,因为它现在尝试运行INSERT 语句。

【问题讨论】:

    标签: sql sql-server sql-server-2017 sql-merge


    【解决方案1】:

    您可以在WHEN中添加表达式表达式:

    WHEN NOT MATCHED BY SOURCE AND T.IDSID <> S.IDSID THEN
         UPDATE SET T.Person_Status_Type = 'INACTIVE',
                    T.Active = 0;
    

    【讨论】:

    • 如果你尝试这样说The identifier 'S.IDSID' cannot be bound. Only target columns and columns in the clause scope are allowed in the 'WHEN NOT MATCHED BY SOURCE' clause of a MERGE statement.,SQL 服务器会报错
    【解决方案2】:

    实际上我让这变得困难。我所要做的就是将额外的查询放在WHEN MATCHED 上,然后一切都按预期工作,除非发生变化,否则不会发生任何更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 2013-08-06
      • 2020-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      相关资源
      最近更新 更多