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

    你可能感兴趣的文章
    nginx+uwsgi+django
    查看>>
    Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
    查看>>
    nginx-vts + prometheus 监控nginx
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    Nginx之二:nginx.conf简单配置(参数详解)
    查看>>
    Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
    查看>>
    Nginx代理初探
    查看>>
    nginx代理地图服务--离线部署地图服务(地图数据篇.4)
    查看>>
    Nginx代理外网映射
    查看>>
    Nginx代理模式下 log-format 获取客户端真实IP
    查看>>
    Nginx代理解决跨域问题(导致图片只能预览不能下载)
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    nginx反向代理
    查看>>
    nginx反向代理、文件批量改名及统计ip访问量等精髓总结
    查看>>
    Nginx反向代理与正向代理配置
    查看>>
    Nginx反向代理及负载均衡实现过程部署
    查看>>
    Nginx反向代理是什么意思?如何配置Nginx反向代理?
    查看>>
    nginx反向代理解决跨域问题,使本地调试更方便
    查看>>
    Nginx反向代理配置
    查看>>