首页 文章

MERGE也插入NULL记录

提问于
浏览
1

我使用以下语句来更新/插入记录 . 问题是我已经给出了条件 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 回答

  • 0

    ON 子句仅确定用于确定"match"是什么的标准以及所采用的分支 . 它不是过滤器 .

    如果 ON 子句不匹配,那么您将转到 WHEN NOT MATCHED 分支,因此在您的情况下,即使ID匹配但源名称为null,这也将适用 .

    可以将这些附加谓词添加到各个分支 . 例如 .

    WHEN NOT MATCHED AND SOURCE.Name IS NOT NULL
    

    但是因为你没有 WHEN NOT MATCHED BY SOURCE 的分支,并且你所拥有的两个分支都将排除NULL,你也可以使用表表达式来预先过滤掉这些 .

    MERGE TEST2 AS TARGET
    USING (SELECT *
           FROM   TEST1
           WHERE  Name IS NOT NULL) AS SOURCE
    ON TARGET.ID = SOURCE.ID
    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

    您只需在WHEN NOT MATCHED中添加AND条件,如下所示:

    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 AND SOURCE.Name IS NOT NULL THEN
    INSERT (ID, Name, City, State)
    VALUES(SOURCE.ID, SOURCE.Name, SOURCE.City, SOURCE.State);
    

相关问题