Merge OUTPUT 高级用法综合写的一个MergeTab的存储过程

本文介绍了一个T-SQL的MERGE存储过程,用于合并两张表的数据,包括匹配更新、未匹配插入和根据标志位决定是否删除目标表中源表不存在的记录。存储过程通过参数化表名和列名来实现灵活性,同时通过OUTPUT语句记录操作详情。文章还提供了测试数据和执行示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为工作中常用到 合并两张表中的数据, 主要是写下来给自己备忘,T-SQL 中 MERGE 的用法,算是高级吧,
WHEN MATCHED THEN UPDATE -- 中加了 后面要更新的列是否都相等,如果相等就没必要进行更新,只会 增加无用功
WHEN NOT MATCHED BY SOURCE THEN DELETE
OUTPUT $ACTION , INSERTED,DELETED, INTO... 
总而言之,就是把两张表的 MERGE 写成了一个存储过程,只需要传入相应的表名,列名,以及是否 对目的表进行相应删除的标志位
功能上算是较为灵活,但是肯定有很多没考虑到的地方,咋一看来,代码太不简洁需要重构,等有时间弄吧。本也是为了自己备忘,
如果对大家有用也很好,欢迎有兴趣的拍砖,共同完善~

下面的的存储过程能够 when matched UPDATE , 
when not matched Insert , 
WHEN NOT MATCHED THEN DELETE  
-- 使用 DeleteTargetTabFlag 这个标志位进行选择是否有必要
--从目的表中删除存在于源表而不存在于目的表中的记录,若不传这个值,那么默认是不做删除操作的
USE shopping
GO
IF OBJECT_ID('dbo.usp_MergeTabs') IS NOT NULL
DROP PROC dbo.usp_MergeTabs
GO
CREATE PROC dbo.usp_MergeTabs
@TarTabName varchar(128),  --- 目的表名
    @TarJoinCol1 varchar(20), ---目的表中用来联结的 col
    @TarCol2 varchar(20), ---目的表中的要被更新或插入的列 Col2
    @TarCol3 varchar(20),---目的表中的要被更新或插入的列 Col3
@SrcTabName varchar(128), --下同
    @SrcJoinCol1 varchar(20),
    @SrcCol2 varchar(20),
    @SrcCol3 varchar(20),
    @DeleteTargetFlag bit=0  ---是否从 目的表中删除标志位
AS
IF (NULLIF(@TarTabName,'')+NULLIF(@SrcTabName,'')+NULLIF(@TarJoinCol1,'')+NULLIF(@SrcJoinCol1,'')) IS NULL
BEGIN
RAISERROR('SourceTab,SrcJoinCondition or TargetTab,TarJoinCondition should not be blank',-1,-1)
RETURN;
END
ELSE
Declare @SQLCMD varchar(max) = 
'MERGE INTO ' +@TarTabName+' AS t
USING ' +@SrcTabName+' AS r
ON r.' +@SrcJoinCol1+' = t.' +@TarJoinCol1+'
WHEN MATCHED',
@UpdateSQL varchar(max)='',
@InsertSQL varchar(max)='',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值