博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql server使用Merge关键字做插入或更新操作
阅读量:5931 次
发布时间:2019-06-19

本文共 2673 字,大约阅读时间需要 8 分钟。

Merge是关于对于两个表之间的数据进行操作的。

    要使用Merge的场景比如:

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

MERGE语句的基本语法:

MERGE 目标表

USING 源表

ON 匹配条件

WHEN MATCHED THEN

   语句

WHEN NOT MATCHED THEN

   语句;

以上是MERGE的最最基本的语法,语句执行时根据匹配条件的结果,如果在目标表中找到匹配记录则执行WHEN MATCHED THEN后面的语句,如果没有找到匹配记录则执行WHEN NOT MATCHED THEN后面的语句。注意源表可以是表,也可以是一个子查询语句

Merge关键字的一些限制

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

使用范例

MERGE ProductNew AS d USING     Product AS s ON s.ProductID = d.ProductId WHEN NOT MATCHED THEN     INSERT( ProductID,ProductName,Price)         VALUES(s.ProductID,s.ProductName,s.Price) WHEN MATCHED THEN     UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;
MERGE ProductNew AS d USING     Product AS s ON s.ProductID = d.ProductId WHEN NOT MATCHED BY TARGET THEN     INSERT( ProductID,ProductName,Price)         VALUES(s.ProductID,s.ProductName,s.Price) WHEN NOT MATCHED BY SOURCE THEN     DELETE WHEN MATCHED THEN     UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;

 

DECLARE @ID int;DECLARE @isNew as bit = 0;MERGE CUSTOMER WITH(ROWLOCK) as targetusing(select @accountID as AccountID) as sourceon target.ACCOUNT_ID = Source.AccountID AND target.IS_DELETE = 0WHEN MATCHED THEN    UPDATE set CNAME = @cname              ,NICKNAME = @nikename              ,MOBILE = @mobile              ,CERTIFICATE_TYPE = @certificatetype              ,CERTIFICATE_CODE = @certificatecode              ,ADDRESS = @address              ,PHOTO_URL = @photourl              ,BIRTHDAY = @birthday              ,CAREER = @career              ,GENDER = @gender              ,HEIGHT = @heigth              ,WEIGHT = @weight              ,REGIST_ON = @regison              ,MODIFIED_ON = GETDATE()              ,VERSION = target.VERSION + 1                            ,@ID = target.IDWHEN NOT MATCHED THEN    INSERT (CNAME           ,NICKNAME           ,MOBILE           ,CERTIFICATE_TYPE           ,CERTIFICATE_CODE           ,ADDRESS           ,PHOTO_URL           ,BIRTHDAY           ,CAREER           ,GENDER           ,HEIGHT           ,WEIGHT           ,REGIST_ON           ,ACCOUNT_ID           ,IS_DELETE           ,CREATED_ON           ,MODIFIED_ON           ,VERSION           ,GUID           ,SYSTEM_TYPE           ,PRIORITY)    values(@cname          ,@nikename          ,@mobile          ,@certificatetype          ,@certificatecode          ,@address          ,@photourl          ,@birthday          ,@career          ,@gender          ,@heigth          ,@weight          ,@regison          ,@accountID          ,0          ,GETDATE()          ,GETDATE()          ,1          ,NEWID()          ,0          ,0);if @ID is NULL beginset @ID = SCOPE_IDENTITY()set @isNew = 1;end;SELECT @ID as ID,@isNew as IsNew;

 

转载地址:http://bkutx.baihongyu.com/

你可能感兴趣的文章
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
行列式的乘法定理
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
度量时间差
查看>>
MySQL 5.6为什么关闭元数据统计信息自动更新&统计信息收集源代码探索
查看>>
apache prefork模式优化错误
查看>>
jmeter高级用法例子,如何扩展自定义函数
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
JS页面刷新保持数据不丢失
查看>>
清橙A1202&Bzoj2201:彩色圆环
查看>>
使用data pump工具的准备
查看>>
springMVC---级联属性
查看>>
get和post区别
查看>>
crontab执行shell脚本日志中出现乱码
查看>>
Floodlight 在 ChannelPipeline 图
查看>>
做移动互联网App,你的测试用例足够吗?
查看>>
cmd.exe启动参数说明
查看>>