博主做过比较多项目的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_Part22. 组装的参数@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,后面取每批删除行数@@ROWCOUNTprint convert(varchar(50), getdate(), 121) + @strStepInfowhile @iRowCount <> 0begin  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 + 1end'-- ===== 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_Part2print @sqlexec 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_Part2print @sqlexec sp_executesql @sql, @parameters, N' 3 archive 表B', @ArchiveDate

更多相关文章

  1. 基于MQTT实现Android消息推送(Push)
  2. android ndk编译x264开源(用于android的ffmpeg中进行软编码)
  3. Android(安卓)ROM的创建和烧录
  4. Android(安卓)ASE 脚本环境
  5. Android(安卓)模板编写
  6. Android实现圆角弹框功能
  7. android实现静默安装demo
  8. android WebView解析 调用html5页面
  9. Android(安卓)SDK源码提取Python脚本(4.0SDK源码下载地址)

随机推荐

  1. 用Python手写五大经典排序算法,看完这篇终
  2. 动态气泡图,拿走不谢!
  3. 谷歌家的验证码怎么了?搞他!
  4. 墙裂推荐!小白入门数据科学的几个宝藏学习
  5. 东哥的第一个露脸视频来了,还有小惊喜!
  6. 牛逼!一行代码让 pandas 的 apply 速度飙
  7. 太强了!这个 Jupyter notebook 离线工具可
  8. 安利一个Python大数据分析神器!
  9. 5 个pandas神级操作,最后一个长见识了!
  10. 刷爆全网的动态条形图,原来5行Python代码