我们在处理数据的时候,往往会有“有则更新、无则插入”的需求,在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 实现了“有则更新无则插入”的需求。