sql server中怎么实现自动分批删除数据
这篇文章给大家介绍sql server中怎么实现自动分批删除数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
博主做过比较多项目的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@parametersnvarchar(max)='',@parameters_Basenvarchar(max)=N'@strStepInfonvarchar(100)',@sqlnvarchar(max)='',@sql_Part1nvarchar(max)=N'declare@iBatchint=1,--批次@iRowCountint=-1--删除行数,初始为-1,后面取每批删除行数@@ROWCOUNTprintconvert(varchar(50),getdate(),121)+@strStepInfowhile@iRowCount<>0beginprint''beginbatch:''print@iBatchprintconvert(varchar(50),getdate(),121)begintrybegintran',@sql_Delnvarchar(max)=''--@sql_Del脚本需要根据实际情况在后续脚本中自行编写,@sql_Part2nvarchar(max)=N'select@iRowCount=@@rowcountcommittranendtrybegincatchrollbacktranprint''--ErrorMessage:''+convert(varchar,error_line())+''|''+error_message()endcatchwaitfordelay''0:00:01''--延时printconvert(varchar(50),getdate(),121)print''endbatch''select@iBatch=@iBatch+1end'--=====2demo1(delete语句不含参数):archive表A=======================================================select@parameters=@parameters_Base+''--如果有需要增加自定义参数,在这里加,例如@parameters=@parameters_Base+',@ArchiveDatedatetime',@sql_Del='deletetop(50000)tc_Delfrom表Atc_Delinnerjointmp_Delcdoncd.ID=tc_Del.ID'select@sql=@sql_Part1+@sql_Del+@sql_Part2print@sqlexecsp_executesql@sql,@parameters,N'2archive表A'--=====3demo2(delete语句含参数):archive表B=======================================================select@parameters=@parameters_Base+',@ArchiveDaatedatetime'--如果有需要增加自定义参数,在这里加,例如@parameters=@parameters_Base+',@ArchiveDatedatetime',@sql_Del='deletetop(50000)from表BwhereDate<@ArchiveDate'select@sql=@sql_Part1+@sql_Del+@sql_Part2print@sqlexecsp_executesql@sql,@parameters,N'3archive表B',@ArchiveDate
关于sql server中怎么实现自动分批删除数据就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。