经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
sql server编写archive通用模板脚本实现自动分批删除数据
来源:cnblogs  作者:张工502219048  时间:2019/10/8 9:20:43  对本文有异议

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

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

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

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

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

  1. -- ===== 1 分批archive模板 =======================================================
  2. --【请不要修改本模板内容】
  3. /*
  4. 说明:
  5. 1. 组装的archive语句为:@sql = @sql_Part1 + @sql_Del + @sql_Part2
  6. 2. 组装的参数@parameters为:@parameters = @parameters_Base + 自定义参数
  7. 3. 传入参数:@strStepInfo 需要print的step信息
  8. 4. archive逻辑专注于@sql_Del,而非分散于分批。
  9. */
  10. declare @parameters nvarchar(max) = ''
  11. , @parameters_Base nvarchar(max) = N'@strStepInfo nvarchar(100)'
  12. , @sql nvarchar(max) = ''
  13. , @sql_Part1 nvarchar(max) = N'
  14. declare @iBatch int = 1, --批次
  15. @iRowCount int = -1 --删除行数,初始为-1,后面取每批删除行数@@ROWCOUNT
  16. print convert(varchar(50), getdate(), 121) + @strStepInfo
  17. while @iRowCount <> 0
  18. begin
  19. print ''begin batch:''
  20. print @iBatch
  21. print convert(varchar(50), getdate(), 121)
  22. begin try
  23. begin tran
  24. '
  25. , @sql_Del nvarchar(max) = '
  26. ' --@sql_Del脚本需要根据实际情况在后续脚本中自行编写
  27. , @sql_Part2 nvarchar(max) = N'
  28. select @iRowCount = @@rowcount
  29. commit tran
  30. end try
  31. begin catch
  32. rollback tran
  33. print ''-- Error Message:'' + convert(varchar, error_line()) + '' | '' + error_message()
  34. end catch
  35. waitfor delay ''0:00:01'' --延时
  36. print convert(varchar(50), getdate(), 121)
  37. print ''end batch''
  38. select @iBatch = @iBatch + 1
  39. end'
  40.  
  41. -- ===== 2 demo1delete语句不含参数):archive A =======================================================
  42. select @parameters = @parameters_Base + '' --如果有需要增加自定义参数,在这里加,例如@parameters = @parameters_Base + ', @ArchiveDate datetime'
  43. , @sql_Del = '
  44. delete top (50000) tc_Del
  45. from 表A tc_Del
  46. inner join tmp_Del cd on cd.ID = tc_Del.ID
  47. '
  48. select @sql = @sql_Part1 + @sql_Del + @sql_Part2
  49. print @sql
  50. exec sp_executesql @sql, @parameters, N' 2 archive 表A'
  51.  
  52. -- ===== 3 demo2delete语句含参数):archive B =======================================================
  53. select @parameters = @parameters_Base + ', @ArchiveDate datetime' --如果有需要增加自定义参数,在这里加,例如@parameters = @parameters_Base + ', @ArchiveDate datetime'
  54. , @sql_Del = '
  55. delete top (50000)
  56. from 表B
  57. where Date < @ArchiveDate
  58. '
  59. select @sql = @sql_Part1 + @sql_Del + @sql_Part2
  60. print @sql
  61. exec sp_executesql @sql, @parameters, N' 3 archive 表B', @ArchiveDate

 

原文链接:http://www.cnblogs.com/zhang502219048/p/11614337.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号