SQL筆記:利用迴圈刪除超大量資料

偶爾會遇到需要刪除數千萬筆等級的資料表之內部資料的情況,而通常這時候下SQL指令會遇到「刪除到連線逾時」的問題,無論你怎麼下WHERE條件就是無法順利地把資料砍掉,在這種需要超長工作時間的狀況下,正是WHILE迴圈指令的適用之處,這篇文章就是用來說明如何利用SQL的WHILE迴圈指令,順利的將數千萬筆資料進行刪除的方法。

利用WHILE與@@ROWCOUNT參數來完成

利用迴圈大量刪除資料的SQL指令如下:

DECLARE @iRow INT
DECLARE @iDel INT
DECLARE @cMsg NVARCHAR(100)

SET @iDel = 10000; --DeleteRowsPerTimes
SET @iRow = 1;  --InitialParameter

WHILE @iRow <> 0
BEGIN
  DELETE TOP(@iDel) FROM TableWannaDelete WHERE YourCondition
  SET @iRow = @@ROWCOUNT
  SET @cMsg = 'Deleting ... ' + CONVERT(NVARCHAR(100), @iRow)
  RAISERROR(@cMsg, 0, 1) WITH NOWAIT
END

程式碼裡面需要特別說明之處為:

下圖展示實際測試執行後的畫面,但實際上這種刪除方式應該用在百萬或千萬筆等級的資料刪除,這種幾萬筆應該下指令直接砍就可以了。

MSSQL SSMS DeleteHugeData DeleteHugeRows DeleteLargeData ROWCOUNT SqlPrintWithoutBuffer SqlPrintFlush RAISERROR