当收集器的数据与最终表不同时,我正在尝试对表进行简单的更新。我正在使用下面的代码。当第一个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
更改查询以容纳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