sql server編寫archive通用模板腳本實現(xiàn)自動分批刪除數(shù)據(jù)
博主做過比較多項目的archive腳本編寫,對于這種刪除數(shù)據(jù)的腳本開發(fā),肯定是一開始的話用最簡單的一個delete語句,然后由于部分表數(shù)據(jù)量比較大啊,索引比較多啊,會發(fā)現(xiàn)刪除數(shù)據(jù)很慢而且影響系統(tǒng)的正常使用。然后就對delete語句進行按均勻數(shù)據(jù)量分批delete的改寫,這樣的話,原來的刪除一個表用一個語句,就可能變成幾十行,如果archive的表有十幾個甚至幾十個,那我們的腳本篇幅就非常大了,增加了開發(fā)和維護的成本,不利于經(jīng)驗比較少的新入職同事去開發(fā)archive腳本,也容易把注意力分散到所謂分批邏輯中。
根據(jù)這種情況,本周博主(zhang502219048)剛好在工作過程中,總結(jié)并編寫了一個自動分批刪除數(shù)據(jù)的模板,模板固定不變,只需要把注意力集中放在delete語句中,并且可以在delete語句中控制每批刪除的數(shù)據(jù)量,比較方便,通過變量組裝模板sql,避免每個表就單獨寫一個分批邏輯的重復(fù)代碼,化簡為繁,增加分批刪除一個表指定數(shù)據(jù)的話只需要增加幾行代碼就可以(如下所示中的demo1和demo2)。
demo1:不帶參數(shù),根據(jù)表tmp_Del刪除表A對應(yīng)ID的數(shù)據(jù)。
demo2:帶參數(shù),根據(jù)Date字段是否過期刪除表B對應(yīng)數(shù)據(jù)。
具體請參考下面的腳本和相關(guān)說明,如有不懂的地方歡迎評論或私信咨詢博主。
-- ===== 1 分批archive模板 ======================================================= --【請不要修改本模板內(nèi)容】 /* 說明: 1. 組裝的archive語句為:@sql = @sql_Part1 + @sql_Del + @sql_Part2 2. 組裝的參數(shù)@parameters為:@parameters = @parameters_Base + 自定義參數(shù) 3. 傳入?yún)?shù):@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 --刪除行數(shù),初始為-1,后面取每批刪除行數(shù)@@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腳本需要根據(jù)實際情況在后續(xù)腳本中自行編寫 , @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語句不含參數(shù)):archive 表A ======================================================= select @parameters = @parameters_Base + '' --如果有需要增加自定義參數(shù),在這里加,例如@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語句含參數(shù)):archive 表B ======================================================= select @parameters = @parameters_Base + ', @ArchiveDaate datetime' --如果有需要增加自定義參數(shù),在這里加,例如@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
總結(jié)
以上所述是小編給大家介紹的sql server編寫archive通用模板腳本實現(xiàn)自動分批刪除數(shù)據(jù),希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!
相關(guān)文章
mssql server 存儲過程里,bulk insert table from ''路徑+文件'',路徑固定,文件名
mssql server 存儲過程里,bulk insert table from ''路徑+文件'',路徑固定,文件名不固定的實現(xiàn)方法...2007-07-07SQL Server 索引結(jié)構(gòu)及其使用(二) 改善SQL語句
很多人不知道SQL語句在SQL SERVER中是如何執(zhí)行的,他們擔(dān)心自己所寫的SQL語句會被SQL SERVER誤解。2009-04-04SQL Server2022版+SSMS下載安裝教程(保姆級)
本文主要介紹了SQL Server2022版+SSMS下載安裝教程,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10Oracle 10g各個帳號的訪問權(quán)限、登錄路徑、監(jiān)控狀態(tài)命令查詢等等
各個帳號的訪問權(quán)限、登錄路徑、監(jiān)控狀態(tài)命令查詢等等2009-05-05SQLServer觸發(fā)器調(diào)用JavaWeb接口的過程詳解
sqlServer要想調(diào)用web接口,就要使用自帶的存儲過程。而這些存儲過程2005版本以后默認(rèn)時關(guān)閉的,所以要先開啟。對SQLServer觸發(fā)器調(diào)用JavaWeb接口的過程感興趣的朋友一起看看吧2021-12-12查看本地sql server數(shù)據(jù)庫的ip地址的方法指南
程序連線SQL數(shù)據(jù)庫,需要SQL Server實例的名稱或網(wǎng)絡(luò)地址,故本文給大家介紹了查看本地sql server數(shù)據(jù)庫的ip地址的方法指南,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-06-06sqlserver 支持定位當(dāng)前頁,自定義排序的分頁SQL(拒絕動態(tài)SQL)
sqlserver 支持定位當(dāng)前頁,自定義排序的分頁SQL(拒絕動態(tài)SQL)2010-05-05