zoukankan      html  css  js  c++  java
  • sql server编写archive通用模板脚本实现自动分批删除数据【填空式编程】

      博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量比较大啊,索引比较多啊,会发现删除数据很慢而且影响系统的正常使用。然后就对delete语句进行按均匀数据量分批delete的改写,这样的话,原来的删除一个表用一个语句,就可能变成几十行,如果archive的表有十几个甚至几十个,那我们的脚本篇幅就非常大了,增加了开发和维护的成本,不利于经验比较少的新入职同事去开发archive脚本,也容易把注意力分散到所谓分批逻辑中。

      根据这种情况,本周博主(zhang502219048)刚好在工作过程中,总结并编写了一个自动分批删除数据的模板,模板固定不变,只需要把注意力集中放在delete语句中,并且可以在delete语句中控制每批删除的数据量,比较方便,通过变量组装模板sql,避免每个表就单独写一个分批逻辑的重复代码,化简为繁,增加分批删除一个表指定数据的话只需要增加几行代码就可以(如下所示中的demo1和demo2)

      demo1:带参数,根据Date字段是否过期删除表B对应数据。

      demo2:不带参数,根据表tmp_Del删除表A对应ID的数据。

      具体请参考下面的脚本和相关说明,如有不懂的地方欢迎评论或私信咨询博主。 

    -- ===== 1 分批archive模板 =======================================================
    --【请不要修改本模板内容】
    /* 
    说明:
    1. 组装的archive语句为:@sql = @sql_Part1 + @sql_Del + @sql_Part2
    2. 组装的参数@parameters为:@parameters = @parameters_Base + 自定义参数
    3. 输入参数:@strStepInfo 需要print的step信息
    4. 输出参数:@iDeleteCount 总删除行数
    5. archive逻辑专注于@sql_Del,而非分散于分批
    */
    declare @sql nvarchar(max),
            @sql_Part1 nvarchar(max),
            @sql_Del nvarchar(max),
            @sql_Part2 nvarchar(max),
            @parameters nvarchar(max),
            @parameters_Base nvarchar(max) = N'@strStepInfo nvarchar(100), @ArchiveDate datetime, @iDeleteCount int out',
            @iDeleteCount int = 0  --作为输出参数来返回单表删除总行数
    
    select @sql_Part1 = N'
    declare @iBatch int = 1,     --批次
            @iRowCount int = -1  --删除行数,初始为-1,后面取每批删除行数@@ROWCOUNT
    select @iDeleteCount = 0     --初始化总删除行数,输出参数
    print convert(varchar(50), getdate(), 121) + @strStepInfo
    
    while @iRowCount <> 0
    begin
        print ''begin batch:''
        print @iBatch
        print convert(varchar(50), getdate(), 121)
        
        begin try
            begin tran
    '
    , @sql_Del = '
                --delete top (50000) 
                --from 表A
                --where Date < @ArchiveDate
    '  --@sql_Del的demo脚本是注释掉的,需要根据实际情况在后续脚本中自行编写
    , @sql_Part2 = N'    
                select @iRowCount = @@rowcount, @iDeleteCount = @iDeleteCount + @@rowcount
            commit tran  
        end try
        begin catch
            rollback tran
            print ''-- Error Message:'' + convert(varchar, error_line()) + '' | '' + error_message()
        end catch
    
        waitfor delay ''0:00:01'' --延时
    
        print convert(varchar(50), getdate(), 121)
        print ''end batch''
    
        select @iBatch = @iBatch + 1
    end'
    
    -- ===== 2 demo1(delete语句含参数):archive 表A =======================================================
    select @parameters = @parameters_Base  --如果有需要增加自定义参数,在这里加,例如【 + ', @xx datetime'】
    , @sql_Del = '
                delete top (50000) 
                from 表A
                where Date < @ArchiveDate
    '
    select @sql = @sql_Part1 + @sql_Del + @sql_Part2
    --print @sql
    exec sp_executesql @sql, @parameters, N' 2 archive 表A', @ArchiveDate, @iDeleteCount out  --如果有需要增加自定义参数,在这里加,例如【, @xx】
    
    -- ===== 3 demo2(delete语句不含参数):archive 表B =======================================================
    select @parameters = @parameters_Base  --如果有需要增加自定义参数,在这里加,例如【 + ', @xx datetime'】
    , @sql_Del = '
                delete top (50000) t_Del
                from 表B t_Del
                inner join tmp_Del td on td.ID = t_Del.ID
    '
    select @sql = @sql_Part1 + @sql_Del + @sql_Part2
    --print @sql
    exec sp_executesql @sql, @parameters, N' 3 archive 表B', @ArchiveDate, @iDeleteCount out  --如果有需要增加自定义参数,在这里加,例如【, @xx】
  • 相关阅读:
    微信开放平台:OpenAPI、云开发与基础管理能力升级
    腾讯刘颖:从容器到低代码,腾讯云原生技术演进历程
    十年老站长心声:我为什么选择把 Hexo 网站迁移到 Webify
    腾讯云发布微搭生态开放计划,与合作伙伴携手共创产业未来
    SQL Server附加数据库出现错误5123的正确解决方法
    数据分页获取(二)
    Select语句
    数据分页获取(一)
    SQL Server中行转列原理
    QT实现Linux下系统监控小工具之二
  • 原文地址:https://www.cnblogs.com/zhang502219048/p/11614337.html
Copyright © 2011-2022 走看看