SET ROWCOUNT 10000
DELETE FROM temp WHERE OperateTime > @CurrentDate
WHILE @@ROWCOUNT > 1
BEGIN
DELETE FROM temp WHERE OperateTime > @CurrentDate
END
SET ROWCOUNT 0
關鍵點:
SET ROWCOUNT N 限制後續陳述式影響的最大行數,設為 0 表示不限制。@@ROWCOUNT 回傳上一條陳述式實際影響的行數。下一版本將淘汰 ROWCOUNT,建議改用 TOP 子句。
DECLARE @TempRowCount INT = 0
SET ROWCOUNT 10000
DELETE FROM temp
OUTPUT deleted.* INTO temp_deleted
WHERE DepartureDate < DATEADD(day, -@OldDataExpireDayCount, @CurrentDate)
SET @TempRowCount = @@ROWCOUNT
EXEC PRSDBLOGAffectedRowCount @PackageType, 100, @TempRowCount
WHILE @TempRowCount > 1
BEGIN
DELETE FROM temp
OUTPUT deleted.* INTO temp_deleted
WHERE DepartureDate < DATEADD(day, -@OldDataExpireDayCount, @CurrentDate)
SET @TempRowCount = @@ROWCOUNT
EXEC PRSDBLOGAffectedRowCount @PackageType, 100, @TempRowCount
END
SET ROWCOUNT 0
原版在迴圈中直接呼叫記錄預存程序,導致 @@ROWCOUNT 被覆寫為 0(因預存程序內有 SET NOCOUNT ON),造成迴圈無法繼續。改良版先將 @@ROWCOUNT 存入變數 @TempRowCount,再呼叫記錄程序,確保迴圈判斷正確。