您好,登錄后才能下訂單哦!
這篇文章主要介紹了sql server編寫archive通用模板腳本如何實現自動分批刪除數據,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
做過比較多項目的archive腳本編寫,對于這種刪除數據的腳本開發,肯定是一開始的話用最簡單的一個delete語句,然后由于部分表數據量比較大啊,索引比較多啊,會發現刪除數據很慢而且影響系統的正常使用。然后就對delete語句進行按均勻數據量分批delete的改寫,這樣的話,原來的刪除一個表用一個語句,就可能變成幾十行,如果archive的表有十幾個甚至幾十個,那我們的腳本篇幅就非常大了,增加了開發和維護的成本,不利于經驗比較少的新入職同事去開發archive腳本,也容易把注意力分散到所謂分批邏輯中。
根據這種情況,編寫了一個自動分批刪除數據的模板,模板固定不變,只需要把注意力集中放在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通用模板腳本如何實現自動分批刪除數據”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。