sqlserver merge用法

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

 

posted @ 2021-08-20 10:32  一介桃白白  阅读(3583)  评论(0编辑  收藏  举报