Sql-Server
如果 SQL 作業執行超過特定時間,則停止它
我有一個執行儲存過程的 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 小時字元串,並將每天與所選時間進行比較。