催微不带悲伤 发表于 2019-10-14 16:08:20

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


-- ===== 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
页: [1]
查看完整版本: sql server编写archive通用模板脚本实现自动分批删除数据