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 中的數據類型隱式轉換問題,本文給大家介紹的非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下寫這篇文章的時候,還真不知道如何取名,也不知道這...