博客
关于我
删除多个重复记录
阅读量: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 的全局锁、表锁和行锁
    查看>>
    mysql 的存储引擎介绍
    查看>>
    MySQL 的存储引擎有哪些?为什么常用InnoDB?
    查看>>
    mysql 索引
    查看>>
    MySQL 索引失效的 15 种场景!
    查看>>
    MySQL 索引深入解析及优化策略
    查看>>
    MySQL 索引的面试题总结
    查看>>
    mysql 索引类型以及创建
    查看>>
    MySQL 索引连环问题,你能答对几个?
    查看>>
    Mysql 索引问题集锦
    查看>>
    Mysql 纵表转换为横表
    查看>>
    mysql 编译安装 window篇
    查看>>
    mysql 网络目录_联机目录数据库
    查看>>
    MySQL 聚簇索引&&二级索引&&辅助索引
    查看>>
    Mysql 脏页 脏读 脏数据
    查看>>
    mysql 自增id和UUID做主键性能分析,及最优方案
    查看>>
    Mysql 自定义函数
    查看>>
    mysql 行转列 列转行
    查看>>
    Mysql 表分区
    查看>>
    mysql 表的操作
    查看>>