博客
关于我
删除多个重复记录
阅读量: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学习总结(30)——MySQL 索引详解大全
    查看>>
    Mysql学习总结(31)——MySql使用建议,尽量避免这些问题
    查看>>
    Mysql学习总结(32)——MySQL分页技术详解
    查看>>
    Mysql学习总结(33)——阿里云centos配置MySQL主从复制
    查看>>
    Mysql学习总结(35)——Mysql两千万数据优化及迁移
    查看>>
    Mysql学习总结(36)——Mysql查询优化
    查看>>
    Mysql学习总结(37)——Mysql Limit 分页查询优化
    查看>>
    Mysql学习总结(38)——21条MySql性能优化经验
    查看>>
    Mysql学习总结(39)——49条MySql语句优化技巧
    查看>>
    Mysql学习总结(3)——MySql语句大全:创建、授权、查询、修改等
    查看>>
    Mysql学习总结(40)——MySql之Select用法汇总
    查看>>
    Mysql学习总结(41)——MySql数据库基本语句再体会
    查看>>
    Mysql学习总结(42)——MySql常用脚本大全
    查看>>
    Mysql学习总结(43)——MySQL主从复制详细配置
    查看>>
    Mysql学习总结(44)——Linux下如何实现mysql数据库每天自动备份定时备份
    查看>>
    Mysql学习总结(45)——Mysql视图和事务
    查看>>
    Mysql学习总结(46)——8种常被忽视的SQL错误用法
    查看>>
    Mysql学习总结(48)——MySql的日志与备份还原
    查看>>
    Mysql学习总结(49)——从开发规范、选型、拆分到减压
    查看>>
    Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
    查看>>