本文共 2055 字,大约阅读时间需要 6 分钟。
在技术博客中,Insus.NET曾分享过处理重复记录的功能。今天,我将对其进行改编,改为动态存储过程,使其适用于任意一张表。
以下是用于删除多个重复记录的动态存储过程的实现代码。该存储过程能够根据指定的表和字段列表,自动删除重复记录。
SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[usp_Delete_Multiple_Duplicate_Record]( @TABLE_NAME SYSNAME, @Refer_Column_lists NVARCHAR(MAX) -- '[a],[b],[c]')ASBEGIN DECLARE @query NVARCHAR(MAX) = N' ;WITH cte_temp_table(rank_num,'+ @Refer_Column_lists +') AS ( SELECT ROW_NUMBER() OVER(PARTITION BY '+ @Refer_Column_lists +' ORDER BY '+ @Refer_Column_lists +') AS rank_num, '+ @Refer_Column_lists +' FROM '+ @TABLE_NAME +' ) DELETE FROM cte_temp_table WHERE rank_num > 1; ' EXECUTE sp_executeSql @queryEND
设置ANSI_NULLS和QUOTED_IDENTIFIER:这两个设置确保了字符串比较和转义的兼容性,保证存储过程能够正确执行。
创建存储程序:存储程序usp_Delete_Multiple_Duplicate_Record
接受两个参数:
@TABLE_NAME
:指定要操作的表名。@Refer_Column_lists
:指定要用来判断重复性的字段列表,格式为[字段名],[字段名]
。动态生成删除语句:存储程序内部动态生成删除语句,使用ROW_NUMBER()
函数计算每条记录在指定字段下的排名。排名相同的记录即为重复记录,DELETE
操作会删除所有排名大于1的记录。
以下是使用本存储程序的示例:
-- 创建临时表IF OBJECT_ID('tempdb.dbo.#Part') IS NOT NULL DROP TABLE #PartCREATE TABLE #Part ( [ID] INT, [Item] NVARCHAR(40))-- 插入示例数据INSERT INTO #Part ([ID],[Item]) VALUES (23394,'I32-GG443-QT0098-0001'), (45008,'I38-AA321-WS0098-0506'), (14350,'K38-12321-5456UD-3493'), (64582,'872-RTDE3-Q459PW-2323'), (23545,'098-SSSS1-WS0098-5526'), (80075,'B78-F1H2Y-5456UD-2530'), (53567,'PO0-7G7G7-JJY098-0077'), (44349,'54F-ART43-6545NN-2514'), (36574,'X3C-SDEWE-3ER808-8764'), (36574,'RVC-43ASE-H43QWW-9753'), (14350,'K38-12321-5456UD-3493'), (64582,'872-RTDE3-Q459PW-2323'), (80075,'B78-F1H2Y-5456UD-2530'), (53567,'PO0-7G7G7-JJY098-0077'), (44349,'54F-ART43-6545NN-2514'), (44349,'54F-ART43-6545NN-2514'), (36574,'X3C-SDEWE-3ER808-8764')-- 执行存储程序EXECUTE [dbo].[usp_Delete_Multiple_Duplicate_Record] #Part, '[ID],[Item]'-- 查看结果SELECT * FROM #Part
通过动态存储程序,开发者可以快速删除多个重复记录,无需手动编写复杂的删除逻辑。这一方法既灵活又高效,适用于多种实际场景。
转载地址:http://xgtbz.baihongyu.com/