您的位置:首页 > 数据库

SQL Server的Merge —— 一步实现 insert,update,delete

2016-09-29 16:46 393 查看
USE tempdb
GO
IF OBJECT_ID('SourceTable') IS NOT NULL
DROP TABLE SourceTable
IF OBJECT_ID('TargetTable') IS NOT NULL
DROP TABLE TargetTable

--源
CREATE TABLE SourceTable(id INT,[desc] NVARCHAR(50))
--目标
CREATE TABLE TargetTable(id INT,[desc] NVARCHAR(50))

--源表数据
INSERT INTO SourceTable VALUES (1,'描述1'),(2,'描述2'),(3,'描述3'),(4,'描述4')

--目标表数据
INSERT INTO TargetTable VALUES (1,'在源表里存在,将会被更新')
INSERT INTO TargetTable VALUES (2,'在源表里存在,将会被更新')
INSERT INTO TargetTable VALUES (5,'在源表里不存在,将会被删除')
INSERT INTO TargetTable VALUES (6,'在源表里不存在,将会被删除')

SELECT * FROM SourceTable AS st
/*
id	desc
1	描述1
2	描述2
3	描述3
4	描述4
*/

SELECT * FROM TargetTable AS tt
/*
id	desc
1	在源表里存在,将会被更新
2	在源表里存在,将会被更新
5	在源表里不存在,将会被删除
6	在源表里不存在,将会被删除
*/

--注意事项
--1.最后的分号必须有
--2.源表可以是一个具体的表,也可以是一个子查询语句
--3.2008或以上版本才有的功能

MERGE INTO TargetTable AS T		--可添加 TOP 限制操作行数: MERGE TOP(2)
USING SourceTable AS S
ON T.id=S.id
WHEN MATCHED			--当两者的id能匹配,id=1,2的数据被更新
THEN UPDATE SET T.[desc]=s.[desc]
WHEN NOT MATCHED		--目标表没有的ID, 在原表中有,则插入相关的数据
THEN INSERT VALUES(s.id,s.[desc])
WHEN NOT MATCHED BY SOURCE --目标表中存在,源表不存在,则删除
THEN DELETE
OUTPUT $ACTION AS [Action]
,INSERTED.id AS [插入的id]
,INSERTED.[desc] AS [插入的DESC]
,DELETED.id AS [删除的id]
,DELETED.[desc] AS [删除的DESC]
;
/*
Action	插入的id	插入的DESC	删除的id	删除的DESC
INSERT	3	          描述3	       NULL	        NULL
INSERT	4	          描述4	       NULL	        NULL
UPDATE	1	          描述1	       1	    在源表里存在,将会被更新
UPDATE	2	          描述2	       2	    在源表里存在,将会被更新
DELETE	NULL	      NULL	       5	    在源表里不存在,将会被删除
DELETE	NULL	      NULL	       6	    在源表里不存在,将会被删除
*/

SELECT * FROM SourceTable AS st
/*
id	desc
1	描述1
2	描述2
3	描述3
4	描述4
*/
SELECT * FROM TargetTable AS tt
/*
id	desc
1	描述1
2	描述2
3	描述3
4	描述4
*/


参考:

点击打开链接

msdn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐