Sql Server 2008 Merge 关键字 一个条语句实现增删改查

 
简介

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

可以想象出,需要使用Merge的场景比如:

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

MERGE语句的基本语法:

MERGE [TOP ] [into] 目标表

USING 源表

ON 匹配条件

WHEN MATCHED  [AND 其他条件]
THEN [UPDATE|INSERT|DELETE] 语句
WHEN NOT MATCHED  [AND 其他条件]
THEN [UPDATE|INSERT|DELETE] 语句
WHEN NOT MATCHED BY SOURCE  [AND 其他条件] --SOURCE 是指USING 后面的表 
THEN [UPDATE|INSERT|DELETE] 语句
 OUTPUT $ACTION AS [Action], --OUTPUT 语句 Merge操作完成后,将所变动的语句进行输出
                 Inserted.SPDID as [新增的],
                 Updated.SPDID as [更新的],
                 Deleted.SPDID as [删除的]

示例 使用Merge 更新,插入和删除

MERGE INTO [SalesPath_Forecast] a
USING @TblDataUpdate b--临时表
ON (b.SPDID = a.SPDID)    
WHEN MATCHED THEN
UPDATE SET 
    a.[ForecastAmount] =  b.[ForecastAmount] ,
    a.[RiskAmount] =  b.[RiskAmount] ,
    a.[UpsideAmount] =  b.[UpsideAmount] ,
    a.[BridgeAmount] =  b.[BridgeAmount],                
    a.[RootCauseID] = b.[RootCauseID],
    a.[Remark] = b.[Remark]
                                        
WHEN NOT MATCHED THEN
INSERT ([SPDID],….略) 
VALUES (newid(),….略)WHEN NOT MATCHED BY SOURCE --SOURCE 是指USING 后面的表,在原表中存在目标表中不存在 ,直译: 没有根源表匹配上
THEN DELETE  
OUTPUT $ACTION AS [Action], --OUTPUT 语句 Merge操作完成后,将所变动的语句进行输出
Inserted.SPDID as [新增的],
Updated.SPDID as [更新的],
Deleted.SPDID as [删除的];
上面的Merge关键字后面使用了多个WHEN…THEN语句,而这个语句是可选的.也可以仅仅新增或是仅仅删除
Merge关键字的一些限制
  • 使用Merge关键字只能更新一个表
  • 源表中不能有重复的记录
小结

本文简单说明了Merge关键的字的使用。如果你使用的是SQL Server 2008之后的版本,在面对一些比如库存结账之类的业务时,放弃IF…ELSE和手写UPDATE,Insert吧,使用Merge关键字可以使这类操作更加轻松愉悦

转载于:https://www.cnblogs.com/Qbit/archive/2012/11/21/Sql-Server-2008-%E4%B8%ADMerge%E7%9A%84%E7%94%A8%E6%B3%95.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值