2013-08-29 182 views
0

在SQL Server上執行以下操作時,我期望NULL更新值爲88888888,但它會插入新行。 有人可以告訴我我做錯了什麼嗎?MERGE語句未更新

USE tempdb; 

CREATE TABLE TableA (ColA CHAR(8), ColB CHAR(8)) 
CREATE TABLE TableB (ColA CHAR(8), ColB CHAR(8)) 

INSERT INTO TableA VALUES ('XXXXXXXX', NULL) 
INSERT INTO TableA VALUES ('XXXXXXXX', '88888888') 

MERGE INTO TableB AS T 
USING TableA AS S 
ON T.ColA = S.ColA and T.ColB = S.ColB 
WHEN MATCHED 
    THEN 
     UPDATE 
     SET T.ColA = S.ColA, T.ColB = S.ColB 
WHEN NOT MATCHED BY TARGET 
    THEN 
     INSERT (ColA, ColB) VALUES (S.ColA, S.ColB); 

SELECT * FROM TableA 
SELECT * FROM TableB 

DROP TABLE TableA 
DROP TABLE TableB 

非常感謝! 最好的問候, 史蒂夫

回答

2
MERGE INTO TableB AS T 
USING TableA AS S 
ON T.ColA = S.ColA 
WHEN MATCHED 
THEN 
    UPDATE 
    SET T.ColB = S.ColB 

請從加入刪除此:和T.ColB = S.ColB

而且你可以從更新中刪除T.ColA = S.ColA,因爲這些列已經具有相同的值。

+0

嗨索南,你是對的,那些可以被刪除,但結果還是一樣。謝謝! – Brainlock

4

a)表本質上是無序的。即使(如你所期望的)合併一次進行一行(參見下面的c),沒有理由認爲在兩行之間不存在兩行的行不爲零, b)您的ON子句在ColAColB之間指定匹配。兩行至少有一行不同,所以我預計這兩行都不會匹配TableB

中的一行c)SQL語句適用於同時並行影響所有行。它不處理一行,然後轉到下一行。所以在TableB中絕對不會有這樣的情況。

不幸的是,你已經張貼顯然是一個「玩具」的例子,所以我不能提供如何解決它的任何建議 - 你還沒有告訴我們真實的情況是什麼,真正的數據看起來就像,你爲什麼使用MERGE

+0

Damien_The_Unbeliever,您的評論是正確的。它看起來像我試圖做一些不可能使用merge語句。這似乎是我需要一個遊標(...)。感謝提示! – Brainlock