SQL Server MERGE不合并条件

问题描述 投票:0回答:1

当收集器的数据与最终表不同时,我正在尝试对表进行简单的更新。我正在使用下面的代码。当第一个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
sql-server sql-merge
1个回答
0
投票

更改查询以容纳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 
© www.soinside.com 2019 - 2024. All rights reserved.