sql server编写archive通用模板脚本实现自动分批删除数据
文章主要介绍了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通用模板脚本实现自动分批删除数据,希望对大家有所帮助。
- SQL SERVER 2008 r2 数据压缩的两种方法教程
- SQL Server 2000/2005/2008删除或压缩数据库日志的方
- SQL Server数据库查看login所授予的具体权限问题
- SQL Server数据库怎么找出一个表包含的页信息(Page)
- Windows server 2016服务器上安装oracle数据库的教程
- SQL Server数据库基础之行数据转换为列数据
- SQL server数据库创建代码 filegroup文件组修改的示例
- SQLServer数据库处于恢复挂起状态的解决办法
- SQL Server数据库之datepart和datediff应用查找当天上
- SQL Server数据库中的数据类型隐式转换问题
-
SQL SERVER 2008 r2 数据压缩的两种方法教程
文章主要介绍了SQL SERVER 2008 r2 数据压缩的两种方法,多个网站整理的内容,需要的朋友可以参考下...
-
SQL Server 2000/2005/2008删除或压缩数据库日志的方法
最近win2008 r2的服务器比较卡,打开服务器显示也特别慢,sqlserver业务费正常执行,服务器桌面操作也比较卡,经过多方研究发现原来是sqlserver日志文件已经达到了84G导致,这里就为大家分享一下解决方法,需要的朋友可以参考一下...
-
SQL Server数据库查看login所授予的具体权限问题
在SQL Server数据库中如何查看一个登录名(login)的具体权限呢,下面脚本之家小编给大家带来了SQL Server查看login所授予的具体权限问题,感兴趣的朋友一起看看吧...
-
SQL Server数据库怎么找出一个表包含的页信息(Page)
文章主要给大家介绍了关于SQL Server是如何找出一个表包含的页信息(Page)的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL Server具有一定的参考学习价值,...
-
Windows server 2016服务器上安装oracle数据库的教程图解
文章主要介绍了Windows server 2016 安装oracle的教程图解,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 1.安装oracle Oracle的安...
-
SQL Server数据库基础之行数据转换为列数据
文章主要给大家介绍了关于SQL Server基础之行数据转换为列数据的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL Server具有一定的参考学习价值,需要的朋友们...
-
SQL server数据库创建代码 filegroup文件组修改的示例代码
文章主要介绍了SQL server数据库创建代码 filegroup文件组修改的实现方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下数据库的操作:1. 对数据文件...
-
SQLServer数据库处于恢复挂起状态的解决办法
文章主要介绍了SQLServer数据库处于恢复挂起状态的解决办法 ,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下.一、总结 如果数据库处...
-
SQL Server数据库之datepart和datediff应用查找当天上午和下午的数据
文章主要介绍了sqlserver之datepart和datediff应用查找当天上午和下午的数据,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下DATEPART() 函数用于返回日期/时间的单独...
-
SQL Server数据库中的数据类型隐式转换问题
文章主要介绍了SQL Server 中的数据类型隐式转换问题,本文给大家介绍的非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下写这篇文章的时候,还真不知道如何取名,也不知道这...