Sql-Server

如果相關作業或以前的實例尚未完成,是否可以阻止 SQL 代理作業執行?

  • July 13, 2020

我有三個 SQL 代理作業,一個用於管理三個系統資料庫中的每一個。這些活動每兩個小時錯開一次(即上午 9 點和下午 3 點的第 1 條;上午 11 點和下午 5 點的第 2 條;下午 1 點和晚上 7 點的第 3 條)。

在大多數情況下,執行其中一項作業只需不到兩個小時。但是,如果花費的時間比預期的要長,我不希望其他作業執行。因此,如果 Reg 1 上午 9 點的執行時間超過 2 小時,我不希望 Reg 2 上午 11 點的作業執行直到 Reg 1 的作業完成。

我如何使用這個條件執行功能?我在作業的日程表屬性中沒有看到任何內容。如果您需要更多說明,請告訴我!

謝謝!!

最簡單的事情是將所有步驟都放在一個工作中。一個作業的兩個實例不能同時執行是內置的。

我不得不做類似的事情。我處理它的方式是在代理作業的第 1 步中編寫一個 while 循環,該循環將檢查第 2 步中的條件和實際執行情況。在您的情況下,如下所示:https ://dba.stackexchange.com/ a/64091/154196,我想會檢查你的工作狀態。在我的第 1 步中,我編寫了一個 TSQL WHILE 循環,它檢查狀態並在循環中使用 WAITFOR DELAY 以在 5 分鐘後重試。我還寫了一個計數器,它會在 3 小時後終止循環,所以如果它等待那麼久,它就不會執行第 2 步。

編輯:我忘記了,在我的 while 循環中,如果循環計數器過期,我使用 TSQL THROW 使步驟失敗,因此步驟 2 沒有執行。我有單獨的步驟,所以我可以很容易地看到它在失敗或執行步驟 2 之前必須在循環中等待多長時間。

像這樣的東西:

IF ( ( Query referenced above modified to give a count of running) > 0 )
 BEGIN
   PRINT 'Waiting';
   DECLARE @MyCount int = 0
   WHILE (@MyCount < 10 AND ( Query referenced above modified to give a count of running) > 0 )
         BEGIN
           SET @MyCount = @MyCount+1
           WAITFOR DELAY '00:10' --Wait 10 minutes
        END
   IF (@MyCount >= 10 
      THROW 55555, 'Agent Job Still Running. Quitting',1
END

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