我正在尝试合并我的两个表(相同的定义)。
MERGE INTO xx.dbo.acc_s AS Target
USING yy.dbo.acc_s AS Source
ON (Target.acc_id= Source.acc_id AND Target.s_id= Source.s_id AND a_code= Source.a_code)
WHEN NOT matched BY Target THEN
INSERT (acc_id,s_id,a_code)
VALUES (Source.acc_id,Source.s_id,Source.a_code);
我所期望的是“如果目标没有该行,则插入它” - 没有别的。
我在其中一行上出现“违反主键”错误。如果它是按目标匹配的行,它不应该首先尝试插入它。
之后我所做的是:
MERGE INTO xx.dbo.acc_s AS Target
USING yy.dbo.acc_s AS Source
ON (Target.acc_id= Source.acc_id AND Target.s_id= Source.s_id AND ISNULL(a_code, '')= ISNULL(Source.a_code, '')
WHEN NOT matched BY Target THEN
INSERT (acc_id,s_id,a_code)
VALUES (Source.acc_id,Source.s_id,Source.a_code);
它正确拾取。由此,我认为当我合并时,如果我有两个 NULL 列加入 - SQL Server 无法正确解决这个问题。我在这里遇到了预期的行为吗?
我知道我应该更愿意使用
WHEN matched THEN
UPDATE SET a_code = Source.a_code
但在那种情况下,我可能不得不更改很多东西,因为我正试图找到一种通过创建模板查询来更新其他表的通用方法。但是,我知道这可能不实用。
马克辛金森在评论中指出:
你可以做的是从这个调整你的谓词:
到以下:
这将提供一种解决方法,有效地将
NULL
一列中的 a 等同于另一列中的 aNULL
。因此,要将其用于您的合并,如下所示: