Merge关键字是一个神奇的DML关键字。它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句。MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插入、更新或删除操作。
主要用法:
merge无法多次更新同一行,也无法更新和删除同一行
当源表和目标表不匹配时:
若数据是源表有目标表没有,则进行插入操作
若数据是源表没有而目标表有,则进行更新或者删除数据操作
当源表和目标表匹配时:
进行更新操作或者删除操作
语法格式:
MERGE 目标表
USING 源表
ON 匹配条件
WHEN MATCHED THEN
语句
WHEN NOT MATCHED THEN
语句;
其中最后语句分号不可以省略,且源表既可以是一个表也可以是一个子查询语句
WHEN NOT MATCHED BY TARGET
表示目标表不匹配,BY TARGET是默认的,所以上面我们直接使用WHEN NOT MATCHED THEN
WHEN NOT MATCHED BY SOURCE
表示源表不匹配,即目标表中存在,源表中不存在的情况。
注意事项:
Merge 语句最后必须包含分号,以 ; 结束。
使用场景:
平时我们在项目中时常会碰到需要定期同步的问题,比如组织架构、人员信息、物品信息等等。
实战举例:
此时我有一个用户表kb_People,有一个用户表2 kb_People2。你可以把它想象成不同库的用户表。
需求:kb_People表需要每天定时去更新数据,如:新增、修改、删除用户操作。依据来源就是kb_People2,如图
实现:
merge [KBDB].[dbo].[kb_People] as a --目标表 using [KBDB].[dbo].[kb_People2] as b --源表 on a.ID=b.ID --关联关系 when MATCHED then --如果ID相匹配 update set a.name=b.name,a.username=b.username,a.password=b.password,a.peotypeid=b.peotypeid --修改 WHEN NOT MATCHED THEN --如果ID匹配不上 insert (id,name,username,password,peotypeid) values (b.id,b.name,b.username,b.password,b.peotypeid); --新增
结果展示:
最后拿语句再去跑个作用定期执行就搞定了。
参考网址:
https://www.jb51.net/article/75302.htm
https://www.cnblogs.com/zfy-220/p/4977802.html