Sql-Server

如果 SQL 作業執行超過特定時間,則停止它

  • January 15, 2021

我有一個執行儲存過程的 SQL 作業。proc 遍歷多個數據庫,然後執行一系列動態 SQL 查詢來歸檔/刪除每個數據庫中的一堆表。每個動態查詢本身都會循環,因為刪除是在較小的批次中發生的。(如下)

這項工作在一夜之間執行,但如果它執行到早上 7:00,我希望它停止,因為這將進入生產時間。

我知道我可以創建一個單獨的附加作業來執行“dbo.sp_stop_job”來停止我的存檔作業,但我更願意在存檔儲存過程本身中執行它。

我希望 proc 在早上 7:00 退出,無論執行是在表之間還是在每個表中的刪除批次之間,但真的不想通過它一遍又一遍地編寫相同的條件.

我知道我可能會在這裡問很多,但是對此有什麼想法嗎?

DECLARE CURSOR_DB CURSOR FAST_FORWARD FOR
       SELECT DatabaseName
       FROM #Databases
OPEN CURSOR_DB
FETCH NEXT FROM CURSOR_DB INTO @sourceDB
WHILE @@FETCH_STATUS = 0
BEGIN

   SET @SQL = 'DELETE tbl1 in batches'
   EXEC (@SQL)
   SET @SQL = 'DELETE tbl2 in batches'
   EXEC (@SQL)
   SET @SQL = 'DELETE tbl3 in batches'
   EXEC (@SQL)

   FETCH NEXT FROM CURSOR_DB INTO @sourceDB
END
CLOSE CURSOR_DB
DEALLOCATE CURSOR_DB

感謝您的回复。這可以逃避目前的批處理查詢,但不幸的是它並沒有完全結束儲存過程。它基本上跳過查詢並移動到下一個。

實際上,我只是使用類似的解決方案但使用 THROW 讓它工作,但不確定這是否是處理它的正確方法。

這有意義還是錯誤的方法?

IF CAST(GETDATE() AS TIME)>'07:00:00' THROW 51000, 'Job reached cutoff time.', 0;

添加

IF convert(varchar(11),CURRENT_TIMESTAMP,108) >= '06:56:59' BREAK;

在獲取新行之前。

這將在 06:56:59 後停止游標

目前時間戳將轉換為 24 小時字元串,並將每天與所選時間進行比較。

引用自:https://dba.stackexchange.com/questions/283338