2016-06-12 56 views
1

我正在使用下面的語句來更新/插入記錄。問題是我已經給出的條件SOURCE.Name IS NOT NULL,但我仍然得到一個錯誤的插入語句說:MERGE插入NULL記錄也

無法將NULL值插入列「名稱」,表「TEST2」;列不允許有空值。更新失敗。

而這是因爲在TARGET表的名稱列上有一個NOT NULL約束。我只是不想插入任何包含NULL作爲名稱的記錄。另外,我也不想更新名稱爲NULL的TAGRET表中的任何行。

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子句只是確定確定「匹配」是什麼的標準,以及採取什麼分支。這不是一個過濾器。

如果ON子句不匹配,那麼您將轉到WHEN NOT MATCHED分支,所以在您的情況下,即使ids匹配但源名稱爲空,這也適用。

將這些額外的謂詞添加到各個分支將是可能的。例如。

WHEN NOT MATCHED AND SOURCE.Name IS NOT NULL 

但是當你沒有一個分行WHEN NOT MATCHED BY SOURCE兩者你有分支機構,排除空值,你還不如用一個表表達式來進行過濾這些都在前面。

​​3210
+0

感謝您的答覆馬丁。如果我不想更新NULL中SOURCE表中Name的記錄,那麼我還需要在這裏放置相同的子句? 當匹配和SOURCE.Name不是NULL – Newbie

+0

@Newbie我只是注意到了這一點。你可以做到這一點,但看到我的編輯更好的方式。 –

0

你只需要添加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);