我使用以下语句来更新/插入记录 . 问题是我已经给出了条件 SOURCE.Name IS NOT NULL
,但仍然在insert语句中出现错误:
无法将值NULL插入列'Name',表'TEST2';列不允许空值 . 更新失败 .
那是因为TARGET表中的Name列有一个 NOT NULL
约束 . 我只是想要更新TAGRET表中Name为NULL的任何行 .
MERGE TEST2 AS TARGET
USING TEST1 AS SOURCE
ON TARGET.ID = SOURCE.ID
AND SOURCE.Name IS NOT NULL
WHEN MATCHED THEN
UPDATE SET ID=SOURCE.ID,
Name= SOURCE.Name,
City= SOURCE.City,
State = SOURCE.State
WHEN NOT MATCHED THEN
INSERT (ID, Name, City, State)
VALUES(SOURCE.ID, SOURCE.Name, SOURCE.City, SOURCE.State);
2 回答
ON
子句仅确定用于确定"match"是什么的标准以及所采用的分支 . 它不是过滤器 .如果
ON
子句不匹配,那么您将转到WHEN NOT MATCHED
分支,因此在您的情况下,即使ID匹配但源名称为null,这也将适用 .可以将这些附加谓词添加到各个分支 . 例如 .
但是因为你没有
WHEN NOT MATCHED BY SOURCE
的分支,并且你所拥有的两个分支都将排除NULL,你也可以使用表表达式来预先过滤掉这些 .您只需在WHEN NOT MATCHED中添加AND条件,如下所示: