【问题标题】:SQL Server MERGE with conditions not merging条件未合并的 SQL Server MERGE
【发布时间】:2020-01-31 19:11:29
【问题描述】:

当收集器的数据与最终表不同时,我正在尝试对我的表进行简单更新。我正在使用下面的代码。当第一个SELECT 运行时,它告诉我这两列都有数据。在MERGE 语句运行后,我执行了新的SELECT,两列仍显示为NULL。合并没有更新任何内容。

我是否以某种方式弄乱了MERGE 语法?

我的生产代码还包括WHEN NOT MATCHED和其他项目。这只是一个演示问题的小例子。

SELECT l.Region_Name, l.Region_Code
FROM dbo.Collector_Locations l
WHERE l.id = 1038

MERGE INTO dbo.Locations AS T
USING dbo.Collector_Locations S ON T.id = S.id

WHEN MATCHED AND (T.Region_Name <> S.Region_Name OR T.Region_Code <> S.Region_Code)     
    THEN 
        UPDATE SET T.Region_Name = S.Region_Name,
                   T.Region_Code = S.Region_Code;

SELECT l.Region_Name, l.Region_Code
FROM dbo.Locations l
WHERE l.id = 1038

【问题讨论】:

  • 您是否运行过连接查询以确保 id 匹配并且连接后两列中有数据?
  • @JoeC 是的,您可以在我的示例中看到我从两个表中选择了一个特定的 ID,并且两个表中都有数据。它只是不更新​​。

标签: sql-server sql-merge


【解决方案1】:

更改查询以适应 NULL 值:

MERGE dbo.Locations AS T
USING dbo.Collector_Locations S 
ON T.id = S.id
WHEN MATCHED AND (ISNULL(T.Region_Name,'a') <> S.Region_Name OR ISNULL(T.Region_Code,'a') <> S.Region_Code) THEN UPDATE SET
    T.Region_Name = S.Region_Name,
    T.Region_Code = S.Region_Code;

除此之外,语法看起来还不错。这应该可以解决问题。

编辑:

但是,在这种情况下,我会使用 UPDATE 语句:

UPDATE dbo.Locations
SET T.Region_Name = S.Region_Name,T.Region_Code = S.Region_Code
FROM dbo.Locations T 
    INNER JOIN dbo.Collector_Locations S 
        ON T.id = S.id AND (T.Region_Name <> S.Region_Name OR T.Region_Code <> S.Region_Code)

您也可以采用我们最后一组连接条件,因为预期的最终结果将是相同的:

UPDATE dbo.Locations
    SET T.Region_Name = S.Region_Name,T.Region_Code = S.Region_Code
    FROM dbo.Locations T 
        INNER JOIN dbo.Collector_Locations S 
            ON T.id = S.id 

【讨论】:

  • INTO 只是可选的。拥有或删除它对语句本身没有影响。我删除它只是为了确定,它没有任何区别。
  • 我刚刚使用 UPDATE 语句对我的答案添加了一个编辑...您不只使用 UPDATE 语句的任何具体原因?
  • 因为它是包含更多列以及删除和插入的更大合并的一部分。我试图将问题分解为我可以发布的最小项目。
  • 您在此处使用的合并语句语法看起来没有任何问题...您确定映射变量和预期结果吗?
  • 是的。 Collector_Locations 表具有带有两个字符串值的 ID。 Locations 表的 ID 具有这些列的两个 NULL 值。
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2016-11-29
  • 1970-01-01
相关资源
最近更新 更多