博客
关于我
删除多个重复记录
阅读量: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/

    你可能感兴趣的文章
    Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
    查看>>
    Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
    查看>>
    Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
    查看>>
    Node-RED怎样导出导入流程为json文件
    查看>>
    Node-RED订阅MQTT主题并调试数据
    查看>>
    Node-RED通过npm安装的方式对应卸载
    查看>>
    node-request模块
    查看>>
    node-static 任意文件读取漏洞复现(CVE-2023-26111)
    查看>>
    Node.js 8 中的 util.promisify的详解
    查看>>
    node.js debug在webstrom工具
    查看>>
    Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
    查看>>
    Node.js RESTful API如何使用?
    查看>>
    node.js url模块
    查看>>
    Node.js Web 模块的各种用法和常见场景
    查看>>
    Node.js 之 log4js 完全讲解
    查看>>
    Node.js 函数是什么样的?
    查看>>
    Node.js 函数计算如何突破启动瓶颈,优化启动速度
    查看>>
    Node.js 切近实战(七) 之Excel在线(文件&文件组)
    查看>>
    node.js 初体验
    查看>>
    Node.js 历史
    查看>>