mssql sqlserver之merge关键字(插入 更新)应用于说明


摘要:
sqlserver 2008,系统开始提供一个新的关键字merge,在merge关键字中,我们可以进行插入 更新 删除操作。
在merge关键字中,你可以将数据源同目标表进行关联,然后对关联结果集做相关的判断,执行相关的操作。



merge关键字功能说明:
根据连接匹配条件对目标表,进行插入、更新、删除操作。
merge关键字说明:
MERGE [目标表] AS target —指定目标表
using:指定数据源
on :指定目标表和数据源之间的关联字段
when:操作条件子句(WHEN MATCHED、WHEN NOT MATCHED BY 目标表 和 WHEN NOT MATCHED BY 源表)
output:output关键字返回insert update delete merge关键字的操作信息
merge关键字结尾,需使用分号

例:
有表A和表B,
需将表B的数据中的name列,根据keyId关联,全部更新至表A,
如果B表中keyId不存在A中,则将表B的数据插入至表A中,
A表中 特定记录不参与此操作
以上的两种操作在sqlserver2008中,我们可以采用一条sql语句进行操作完成
如下所示:

   create table A(keyId int,name varchar(30),qty int)
create table B(keyId int,name varchar(30))
go
insert into A(keyId,name,qty)values
(1,'test',5),(2,'test2',6),(3,'test3',58),(888,'禁止操作',500)

insert into B(keyId,name)values
(1,'maomao365.com'),(2,'猫猫小屋'),(6,'测试插入')
go

 merge A as targetTb 
 using B as sourceTb
 on(targetTb.keyId = sourceTb.keyId)
 when matched and targetTb.name !='禁止操作'  
 then update set  targetTb.name = sourceTb.name
 when not matched and sourceTb.name  is not null 
 then insert(keyId,name,qty)values(sourceTb.keyId,sourceTb.name,0)
 
 output $action,inserted.*,deleted.* ;
  
 go
 select * from A 


go
drop table A
drop table B
  

mssql_merge关键字insert_update用法

mssql_merge关键字insert_update用法



注意事项:
对目标表进行删除和更新操作,必须是目标表和源数据表进行内连接关联后的数据才可以进行相关操作
when not matched by [目标表] -类似于 目标表和源表左连接 –缺省值为 by [目标表]
when not matched by [源表] -类似于 目标表和源表右连接
when matched 才可以进行 update delete操作(因为数据未匹配成功,无法进行删除和更新操作)