欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-10-14 08:06:54
博主做过比较多项目的archive脚本编写,对于这种删除数据的脚本开发,肯定是一开始的话用最简单的一个delete语句,然后由于部分表数据量比较大啊,索引比较多啊,会发现删除数据很慢而且影响系统的正常使用。然后就对delete语句进行按均匀数据量分批delete的改写,这样的话,原来的删除一个表用一 ......

博主做过比较多项目的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通用模板脚本实现自动分批删除数据,希望对大家有所帮助