主要簡化了比對兩個表格差異處時的新增、修改、刪除動作,
以前需要分開撰寫INSERT、UPDATE、DELETE語法,
透過MERGE比對資料,根據設定更新資料!
--刪除測試表格 IF (SELECT OBJECT_ID('tempdb..#Src_Tmp')) IS NOT NULL DROP TABLE #Src_Tmp; IF (SELECT OBJECT_ID('tempdb..#Tra_Tmp')) IS NOT NULL DROP TABLE #Tra_Tmp; --建立表A CREATE TABLE #Src_Tmp ( ProdNo VARCHAR(5), Qty INT ) --建立表B CREATE TABLE #Tra_Tmp ( ProdNo VARCHAR(5), Qty INT, Memo NVARCHAR(MAX) ) --新增資料 INSERT INTO #Src_Tmp VALUES ('aa',10),('bb',22),('cc',22),('dd',69) INSERT INTO #Tra_Tmp VALUES ('aa',8,NULL),('ab',15,NULL),('bb',10,NULL),('cc',22,NULL) /* --查詢各表格 select * from #Src_Tmp select * from #Tra_Tmp --合併表格 FULL JOIN select ProdNo=COALESCE(S.ProdNo,T.ProdNo), SQty=S.Qty,TSQty=T.Qty from #Src_Tmp S FULL JOIN #Tra_Tmp T ON S.ProdNo=T.ProdNo */ --MERGE MERGE INTO #Tra_Tmp AS T--TARGET USING #Src_Tmp AS S--SOURCE ON (T.ProdNo=S.ProdNo) WHEN NOT MATCHED BY TARGET THEN--以SOURCE比對TATGET,新增TARGET缺少的部分 INSERT (ProdNo,Qty) VALUES (S.ProdNo,S.Qty) WHEN NOT MATCHED BY SOURCE THEN--以TATGET比對SOURCE,刪除TATGET多餘的部分 DELETE WHEN MATCHED AND (S.Qty<>T.Qty) THEN--Qty資料不相符,以SOURCE更新TATGET Qty欄位 UPDATE SET T.Qty=S.Qty OUTPUT $action, inserted.*, deleted.*;--輸出inserted、deleted內容
下面截圖顯示資料變動的經過
參考自
MSDN-MERGE (Transact-SQL)
TechNet-使用 MERGE 插入、更新,和刪除資料
SQL Server 2008 T-SQL 新語法介紹 - Merge (效能改善)
沒有留言:
張貼留言