• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    sql server编写archive通用模板脚本实现自动分批删除数据

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

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

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

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

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

    -- ===== 1 分批archive模板 =======================================================
    --【请不要修改本模板内容】
    /* 
    说明:
    1. 组装的archive语句为:@sql = @sql_Part1 + @sql_Del + @sql_Part2
    2. 组装的参数@parameters为:@parameters = @parameters_Base + 自定义参数
    3. 传入参数:@strStepInfo 需要print的step信息
    4. archive逻辑专注于@sql_Del,而非分散于分批。
    */
    declare @parameters nvarchar(max) = ''
    , @parameters_Base nvarchar(max) = N'@strStepInfo nvarchar(100)'
    , @sql nvarchar(max) = ''
    , @sql_Part1 nvarchar(max) = N'
    declare @iBatch int = 1,   --批次
        @iRowCount int = -1 --删除行数,初始为-1,后面取每批删除行数@@ROWCOUNT
    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 nvarchar(max) = '
    ' --@sql_Del脚本需要根据实际情况在后续脚本中自行编写
    , @sql_Part2 nvarchar(max) = N'  
          select @iRowCount = @@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 + '' --如果有需要增加自定义参数,在这里加,例如@parameters = @parameters_Base + ', @ArchiveDate datetime'
    , @sql_Del = '
          delete top (50000) tc_Del 
          from 表A tc_Del
          inner join tmp_Del cd on cd.ID = tc_Del.ID
    '
    select @sql = @sql_Part1 + @sql_Del + @sql_Part2
    print @sql
    exec sp_executesql @sql, @parameters, N' 2 archive 表A'
    -- ===== 3 demo2(delete语句含参数):archive 表B =======================================================
    select @parameters = @parameters_Base + ', @ArchiveDaate datetime' --如果有需要增加自定义参数,在这里加,例如@parameters = @parameters_Base + ', @ArchiveDate datetime'
    , @sql_Del = '
          delete top (50000) 
          from 表B
          where Date  @ArchiveDate
    '
    select @sql = @sql_Part1 + @sql_Del + @sql_Part2
    print @sql
    exec sp_executesql @sql, @parameters, N' 3 archive 表B', @ArchiveDate

    总结

    以上所述是小编给大家介绍的sql server编写archive通用模板脚本实现自动分批删除数据,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

    您可能感兴趣的文章:
    • python处理数据,存进hive表的方法
    • python导出hive数据表的schema实例代码
    • php ZipArchive实现多文件打包下载实例
    • mysql 5.7.18 Archive压缩版安装教程
    • mysql 5.7 zip archive版本安装教程
    • 使用shell脚本执行hive、sqoop命令的方法
    • shell中循环调用hive sql 脚本的方法
    • hive-shell批量命令执行脚本的实现方法
    • 如何在python中写hive脚本
    上一篇:C# ling to sql 取多条记录最大时间
    下一篇:SQL Server怎么找出一个表包含的页信息(Page)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    sql server编写archive通用模板脚本实现自动分批删除数据 sql,server,编写,archive,通用,