2016-08-15 21 views
0

我有一個表tblstars_new,它每週從客戶端更新一次。我有另一個表tblstars,它需要從tblstars_new導入新的和更新的數據。針對不匹配的值編寫一條MERGE語句

查找tblstars_new中不存在的tblstars中的行,然後將其添加到tblstars中很簡單。

但是,我還需要在tblstars_new中查找列PandA_Code已更改的行,然後更新tblstars中的相同行。

該查詢告訴我來自tblstars_new的哪些行的PandA_Code已更改並需要在tblstars中進行更新。

SELECT 
    sn.* 
FROM 
    tblstars_new sn 
    JOIN tblstars s ON sn.Student_ID_Number = s.Student_ID_Number AND sn.PandA_Code != s.PandA_Code 

我想弄清楚會做出更改的MERGE語句。正如我在Prod中所做的那樣,我無法真正玩耍。兩個問題:

1)是否可以在沒有實際執行的情況下查看更改?

2)MERGE語句是否正確?

BEGIN TRAN; 
MERGE tblstars AS T   -- Target 
USING tblstars_new AS S  -- Source 
ON 
    (T.Student_ID_Number = S.Student_ID_Number AND T.PandA_Code != S.PandA_Code) 
WHEN NOT MATCHED BY TARGET 
    THEN 
    UPDATE SET T.PandA_Code = S.PandA_Code 
OUTPUT $action; 
ROLLBACK TRAN; 
GO 
+0

取兩個表的備份並用新名稱保存,然後進行測試。我希望它不會造成太多的問題,並且是100倍安全的。 – Zi0n1

+0

〜我認爲只是將您的WHEN NOT MATCHED切換到WHEN MATCHED可能會工作,但尚未測試 – bhs

+0

如果@ sboahra的答案已解決您的問題,那麼需要從tblstars_new導入新的和更新的數據?那麼**新**? –

回答

1

這簡直是通過加盟的合併而不是語句來完成:

UPDATE T SET T.PandA_Code = S.PandA_Code FROM tblstart T 
INNER JOIN tblstars_new P ON P.Student_ID_Number = T.Student_ID_Number 
WHERE T.PandA_Code <> S.PandA_Code 
2

這裏是MERGE查詢滿足您的要求。

BEGIN TRAN; 
MERGE tblstars AS T   -- Target 
USING tblstars_new AS S  -- Source 
ON T.Student_ID_Number = S.Student_ID_Number -- They shoudl match by PK 
WHEN MATCHED AND AND T.PandA_Code != S.PandA_Code 
    THEN     -- when matched and PandA_Code different update them 
    UPDATE SET T.PandA_Code = S.PandA_Code 
WHEN NOT MATCHED BY TARGET -- When not matched by TARGET (there is in source but not in target) 
    THEN INSERT (<field1, field2, ...>) 
     VALUES (<S.field1, S.filed2, ...>) -- then insert them 
OUTPUT deleted.*, $action, inserted.* INTO #TheTempTable; 
SELECT * FROM #TheTempTable; -- here you can see the cnages and rollback if something is wrong 
ROLLBACK TRAN; 
GO