博客
关于我
删除多个重复记录
阅读量:494 次
发布时间:2019-03-06

本文共 2055 字,大约阅读时间需要 6 分钟。

动态存储过程:删除多个重复记录的高效方法

在技术博客中,Insus.NET曾分享过处理重复记录的功能。今天,我将对其进行改编,改为动态存储过程,使其适用于任意一张表。

动态存储过程实现

以下是用于删除多个重复记录的动态存储过程的实现代码。该存储过程能够根据指定的表和字段列表,自动删除重复记录。

SET ANSI_NULLS ONGO
SET QUOTED_IDENTIFIER ONGO
CREATE PROCEDURE [dbo].[usp_Delete_Multiple_Duplicate_Record]
(
@TABLE_NAME SYSNAME,
@Refer_Column_lists NVARCHAR(MAX) -- '[a],[b],[c]'
)
AS
BEGIN
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 @query
END

代码解释

  • 设置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 #Part
    CREATE 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/

    你可能感兴趣的文章
    mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
    查看>>
    Multiple websites on single instance of IIS
    查看>>
    mysql CONCAT()函数拼接有NULL
    查看>>
    multiprocessing.Manager 嵌套共享对象不适用于队列
    查看>>
    multiprocessing.pool.map 和带有两个参数的函数
    查看>>
    MYSQL CONCAT函数
    查看>>
    multiprocessing.Pool:map_async 和 imap 有什么区别?
    查看>>
    MySQL Connector/Net 句柄泄露
    查看>>
    multiprocessor(中)
    查看>>
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
    查看>>
    mysql csv import meets charset
    查看>>
    multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
    查看>>
    MySQL DBA 数据库优化策略
    查看>>
    multi_index_container
    查看>>
    mutiplemap 总结
    查看>>
    MySQL Error Handling in Stored Procedures---转载
    查看>>
    MVC 区域功能
    查看>>