使用WHERE NOT EXISTS子句去重时如何通知用户被跳过的重复数据
实现方案
这个需求完全可以实现,核心思路是提前筛选出重复行存储到独立的表变量中,最后将重复行结果集、插入成功行数等信息返回给调用端即可,具体修改后的存储过程代码如下:
CREATE PROCEDURE [dbo].[spMyProcedure] @param udtMyUserDefinedTableType, @DuplicateCount INT OUTPUT -- 可选输出参数,返回重复行总数 AS BEGIN SET NOCOUNT ON; -- 定义表变量存储重复行数据 DECLARE @DuplicateRows TABLE ( Column1 [对应字段类型], Column2 [对应字段类型], Column3 [对应字段类型], Column4 [对应字段类型], Column5 [对应字段类型] ); -- 筛选出所有重复的行存入表变量 INSERT INTO @DuplicateRows SELECT o.Column1, o.Column2, o.Column3, o.Column4, o.Column5 FROM tblMyTable i INNER JOIN @param o ON i.Column1 = o.Column1 AND i.Column3 = o.Column3 AND i.Column5 = o.Column5; -- 获取重复行总数赋值给输出参数 SELECT @DuplicateCount = COUNT(1) FROM @DuplicateRows; -- 原有插入逻辑保持不变 INSERT INTO tblMyTable SELECT Column1, Column2, Column3, Column4, Column5 FROM @param WHERE NOT EXISTS ( SELECT 1 FROM tblMyTable i INNER JOIN @param o ON i.Column1 = o.Column1 AND i.Column3 = o.Column3 AND i.Column5 = o.Column5 ); -- 可选:返回成功插入的行数 SELECT @@ROWCOUNT AS InsertedRowCount; -- 存在重复行时返回具体重复行明细 IF @DuplicateCount > 0 BEGIN SELECT * FROM @DuplicateRows; END END
注意:请将代码中
[对应字段类型]替换为你业务表tblMyTable中对应字段的实际数据类型。
使用说明
- 你可以根据业务需要选择是否保留
@DuplicateCount输出参数,方便上层应用直接读取重复行数做前端提示 - 返回的重复行结果集里包含了所有和现有表重复的入参行字段,你可以按需调整返回的字段内容
- 如果需要避免同一批次入参里本身就有重复行的场景,可以额外对
@param里的重复数据做提前去重校验,逻辑和上面筛选和现有表重复的逻辑一致
内容的提问来源于stack exchange,提问作者Ole M
相关产品推荐
相关产品推荐

