SQL SERVER MERGE 有则更新无则插入

        我们在处理数据的时候,往往会有“有则更新、无则插入”的需求,在SQL 2008 之前,通常是通过if 判断等,来做查询处理,SQL 2008 引入了MERGE ,可以更好的实现我们的需求,测试数据:

--测试数据
if not object_id(N'SourceTable') is null
    drop table SourceTable
Go
CREATE TABLE DBO.SourceTable(
id INT,
[DESC] NVARCHAR(50)
)
INSERT INTO dbo.SourceTable(id,[DESC])
SELECT 1,N'描述1'
UNION ALL
SELECT 2,N'描述2'
UNION ALL
SELECT 3,N'描述3'
UNION ALL
SELECT 4,N'描述4'
--测试数据结束

        在表上新建触发器:

--创建触发器
CREATE TRIGGER dbo.trtest
   ON  dbo.SourceTable
   INSTEAD OF INSERT
AS 
BEGIN
	
	MERGE INTO dbo.SourceTable AS a
	USING Inserted AS b
	ON a.id=b.id
	WHEN MATCHED
	THEN UPDATE SET a.[DESC] = b.[DESC]
	WHEN NOT MATCHED
	THEN INSERT VALUES(b.id,b.[DESC]);

END
GO

        测试数据如下,插入一个已有的id:

--插入已有id数据
INSERT INTO dbo.SourceTable(id,[DESC])
SELECT 1,N'测试id为1的'
--查看结果
SELECT * FROM SourceTable

        结果我们可以看到,对表中id为1的数据进行了更新:


        我们在测试一个表中没有的数据:

--测试没有的数据
INSERT INTO dbo.SourceTable(id,[DESC])
SELECT 5,N'测试没有的数据'
--查看结果
SELECT * FROM SourceTable

        结果可以看到,新的数据插入到了表中:


        以上,我们通过MERGE 实现了“有则更新无则插入”的需求。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值