Merge简介

    Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。”,通过这个描述,我们可以看出Merge是关于对于两个表之间的数据进行操作的。

使用场景:

  •     数据同步
  •     数据转换
  •     基于源表对目标表做Insert,Update,Delete操作

Merge关键字的一些限制

  •     使用Merge关键字只能更新一个表
  •     源表中不能有重复的记录

Merge使用示例

1.Merge示例



首先建立源表和目标表,并插入相关的数据,如图1所示。



SQL server merge语句停止后会回滚吗 sql merge函数_Server



下面写一个简单的Merge示例



MERGE INTO T_B AS B
USING T_A AS A ON B.id=A.ID
WHEN MATCHED --当B.id=A.ID时,更新目标表
THEN UPDATE SET B.name=A.name,B.Remark='更新记录'
WHEN NOT MATCHED --若目标表中不存在,则新源表记录插入目标表
THEN INSERT(id,name,book,remark) VALUES(A.id,A.name,A.book,'从源表添加')
WHEN NOT MATCHED BY SOURCE --源表中不存在,目标表存在
THEN DELETE;



执行前记录:



SQL server merge语句停止后会回滚吗 sql merge函数_SQL_02



SQL server merge语句停止后会回滚吗 sql merge函数_Server_03




2.Output子句


 Merge语句还有一个强大的功能是通过OUTPUT子句,可以将刚刚做过变动的数据进行输出。我们在上面的Merge语句后加入OUTPUT子句,如图所示。


--Merge Output
MERGE INTO T_B AS B
USING T_A AS A ON B.id=A.ID
WHEN MATCHED --当B.id=A.ID时,更新目标表
THEN UPDATE SET B.name=A.name,B.Remark='更新记录'
WHEN NOT MATCHED --若目标表中不存在,则新源表记录插入目标表
THEN INSERT(id,name,book,remark) VALUES(A.id,A.name,A.book,'从源表添加')
WHEN NOT MATCHED BY SOURCE --源表中不存在,目标表存在
THEN DELETE
OUTPUT $ACTION AS [ACTION],Inserted.id AS 插入的ID,Inserted.name 插入的Name,
Deleted.id AS 删除的ID,Deleted.name AS 删除的Name;

输出结果:

SQL server merge语句停止后会回滚吗 sql merge函数_Server_04


3.其它条件组合使用
3.1 TOP约束


我们还可以使用TOP关键字限制目标表被操作的行。在上例的语句基础上加上了TOP关键字,我们看到只有指定行被执行。


SQL server merge语句停止后会回滚吗 sql merge函数_Merge_05


3.2AND附加限制条件


注意:


1.不能有多个 MATCHED  和 Not  MATCHED,即使是加and 条件的也不行,只给有一次。


2.NOT MATCHED BY SOURCE  可以加条件出现多次,但不带and 条件限制的NOT MATCHED BY SOURCE 必须出现在带and 条件的后面。


SQL语句


SQL server merge语句停止后会回滚吗 sql merge函数_SQL_06



SQL server merge语句停止后会回滚吗 sql merge函数_SQL_07


执行前源表与目标表记录:



SQL server merge语句停止后会回滚吗 sql merge函数_Server_08


执行后目标表结果:



SQL server merge语句停止后会回滚吗 sql merge函数_Merge_09