SQL 条件不合并的服务器 MERGE
SQL Server MERGE with conditions not merging
当收集器的数据与最终 table 不同时,我正在尝试对我的 table 进行简单更新。我正在使用下面的代码。当第一个 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
当收集器的数据与最终 table 不同时,我正在尝试对我的 table 进行简单更新。我正在使用下面的代码。当第一个 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