這篇文章主要介紹了sql server編寫archive通用模板腳本如何實(shí)現(xiàn)自動(dòng)分批刪除數(shù)據(jù),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)建站主營(yíng)青浦網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App制作,青浦h5小程序制作搭建,青浦網(wǎng)站營(yíng)銷推廣歡迎青浦等地區(qū)企業(yè)咨詢
做過(guò)比較多項(xiàng)目的archive腳本編寫,對(duì)于這種刪除數(shù)據(jù)的腳本開發(fā),肯定是一開始的話用最簡(jiǎn)單的一個(gè)delete語(yǔ)句,然后由于部分表數(shù)據(jù)量比較大啊,索引比較多啊,會(huì)發(fā)現(xiàn)刪除數(shù)據(jù)很慢而且影響系統(tǒng)的正常使用。然后就對(duì)delete語(yǔ)句進(jìn)行按均勻數(shù)據(jù)量分批delete的改寫,這樣的話,原來(lái)的刪除一個(gè)表用一個(gè)語(yǔ)句,就可能變成幾十行,如果archive的表有十幾個(gè)甚至幾十個(gè),那我們的腳本篇幅就非常大了,增加了開發(fā)和維護(hù)的成本,不利于經(jīng)驗(yàn)比較少的新入職同事去開發(fā)archive腳本,也容易把注意力分散到所謂分批邏輯中。
根據(jù)這種情況,編寫了一個(gè)自動(dòng)分批刪除數(shù)據(jù)的模板,模板固定不變,只需要把注意力集中放在delete語(yǔ)句中,并且可以在delete語(yǔ)句中控制每批刪除的數(shù)據(jù)量,比較方便,通過(guò)變量組裝模板sql,避免每個(gè)表就單獨(dú)寫一個(gè)分批邏輯的重復(fù)代碼,化簡(jiǎn)為繁,增加分批刪除一個(gè)表指定數(shù)據(jù)的話只需要增加幾行代碼就可以(如下所示中的demo1和demo2)。
demo1:不帶參數(shù),根據(jù)表tmp_Del刪除表A對(duì)應(yīng)ID的數(shù)據(jù)。
demo2:帶參數(shù),根據(jù)Date字段是否過(guò)期刪除表B對(duì)應(yīng)數(shù)據(jù)。
具體請(qǐng)參考下面的腳本和相關(guān)說(shuō)明
-- ===== 1 分批archive模板 ======================================================= --【請(qǐng)不要修改本模板內(nèi)容】 /* 說(shuō)明: 1. 組裝的archive語(yǔ)句為:@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ù)實(shí)際情況在后續(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'' --延時(shí) print convert(varchar(50), getdate(), 121) print ''end batch'' select @iBatch = @iBatch + 1 end' -- ===== 2 demo1(delete語(yǔ)句不含參數(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語(yǔ)句含參數(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
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“sql server編寫archive通用模板腳本如何實(shí)現(xiàn)自動(dòng)分批刪除數(shù)據(jù)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
當(dāng)前題目:sqlserver編寫archive通用模板腳本如何實(shí)現(xiàn)自動(dòng)分批刪除數(shù)據(jù)
當(dāng)前地址:http://chinadenli.net/article28/gigccp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、企業(yè)網(wǎng)站制作、小程序開發(fā)、建站公司、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)