1. 程式人生 > >使用MERGE方便快捷地更新資料表

使用MERGE方便快捷地更新資料表

在 SQL Server 2008 中,您可以使用 MERGE 語句,根據與源表聯接的結果,對目標表執行插入、更新或刪除操作。避免寫太多的IF……ELSE語句。

MERGE 語法包括五個主要子句:
MERGE 子句:用於指定作為插入、更新或刪除操作目標的表或檢視。
USING 子句:用於指定要與目標聯接的資料來源。
ON 子句:用於指定決定目標與源的匹配位置的聯接條件。
WHEN 子句:(WHEN MATCHED、WHEN NOT MATCHED BY TARGET 和 WHEN NOT MATCHED BY SOURCE)基於 ON 子句的結果和在 WHEN 子句中指定的任何其他搜尋條件指定所要採取的操作。
OUTPUT 子句:

針對插入、更新或刪除的目標中的每一行返回一行。

示例:

源表和目標表如下:


根據與源表(Table_Source)聯接的結果,對目標表(Table_Target)執行插入、更新或刪除操作:

--這是要執行操作的目標表,as指定別名
merge into Table_Target as T
--using後面是用來做資料對比的源表,也可是using (select column1,column2...) as S
using Table_Source as S
--on後面是匹配條件
on T.name=S.stuname
--當資料匹配時,使用源表中的major更新目標表中的class,因為操作的是目標表,所以update、insert、delete後面不用寫表名
when matched
	then 
	update set T.class=S.major
--當目標表中不存在,而源表中存在時,執行insert操作,這裡的by target可以省略
when not matched by target
	then 
	insert values(S.stuname,S.major)
--當目標表中存在,而源表中不存在時,執行delete操作,這裡的by source不能省略
when not matched by source
	then 
	delete;

操作之後的目標表如下:

將上面程式碼最後的“;”改為output語句執行的話,可以輸出剛剛做過變動的資料:

output $action as '動作',
inserted.name as '插入的name',
inserted.class as '插入的class',
deleted.name as '刪除的name',
deleted.class as '刪除的class';
目標表中資料的變動情況如下: