我目前正在使用這樣的代碼來檢測SQL服務器作業是否正在運行。 (這是SQL Server 2005,所有SP的)如何準確檢測SQL Server作業是否正在運行並處理已在運行的作業?
return (select isnull(
(select top 1 CASE
WHEN current_execution_status = 4 THEN 0
ELSE 1
END
from openquery(devtestvm, 'EXEC msdb.dbo.sp_help_job')
where current_execution_status = 4 and
name = 'WQCheckQueueJob' + cast(@Index as varchar(10))
), 1)
)
那裏沒有問題,一般來說,它工作得很好。
但是....(總是但是)
有時,我會調用此,得到的回覆是「作業未運行」的結果,在這一點上,我會嘗試,並開始工作,通過
exec msdb.dbo.sp_start_job @JobName
和SQL將返回「的SQLAgent拒絕開始工作,因爲它已經有一個懸而未決的要求」。
確定。也沒有問題。可以想象,在這個代碼可以啓動之前,有一個目標作業可以開始的小窗口,但在檢查它是否已經啓動之後。但是,我可以把它包裝起來,只是忽略錯誤,對吧?
begin try
if dbo.WQIsQueueJobActive(@index) = 0 begin
exec msdb.dbo.sp_start_job @JobName
break
end
end try begin catch
-- nothing here
end catch
雖然是這樣的問題。
9次了10年,這工作得很好。 SQL代理會引發錯誤,它會被捕獲,並且處理會繼續進行,因爲作業已經在運行,不會造成任何損壞。
但是偶爾,我會在Job History視圖中看到一條消息(請記住上面的代碼來檢測某個特定的作業是否正在運行,如果沒有從另一個作業運行,則啓動它)說該作業失敗因爲「SQLAgent已拒絕啓動該作業,因爲它已經有待處理的請求」。
當然,這是嘗試捕捉精確的錯誤應該被處理!
如果發生這種情況,執行工作剛剛去世,但不會立即從我可以告訴,只是八九不離十。我已經把記錄放在了地方,沒有一致性。有一次它失敗了,它會在a地點,下一次在地點b。在某些情況下,場所A和場所B只有一個
select @var = 'message'
在它們之間。很奇怪。基本上,這項工作似乎被毫不客氣地拋棄,任何留在工作中執行的東西都根本沒有被執行。但是,如果我刪除了「exec StartJob」(或者只是調用一次,當我知道目標作業不能運行時),那麼所有的工作都可以正常運行,並且我在作業中的所有處理都會通過。
這一切背後的目的是爲了有一份工作開始作爲觸發的結果(除其他事項外),並且,如果作業已經啓動,真的沒有必要「再次啓動」。
有誰碰到與SQL代理的作業處理這樣的行爲?
編輯: 電流控制的流程是,像這樣:
- 更改表中(更新或插入)...
- 火災引發這就要求...
- 這...
- 開始具體工作,這一個存儲過程調用哪個...
- sp_Start_Job ...
- 調用另一個存儲過程(稱爲CheckQueue),這...
- 執行一些處理和...
- 檢查幾個表,並根據其內容可能......另一份工作
- 調用sp_start_job啓動第二個,同時工作 來處理額外的工作(這第二份工作,調用存儲過程CheckQueue也 但兩個調用操作上的數據完全獨立的套)
不是我真正尋找的答案,但作爲一種解決方法,我創建了一個「監視」表中,包含一個標誌,指示各特定的工作是否是「真」運行與否,和到期時間警惕失敗。所以,如果這個標誌表明一個作業沒有運行,那麼它就無法運行,所以啓動它是安全的。如果它指示它正在運行,那麼我使用sp_help_job方法來檢查作業是否正在運行。如果這返回它沒有運行。我碰到一個櫃檯並繼續。 – DarinH 2011-05-27 14:27:26
如果計數器在它們之間連續碰撞x次,那麼我可以合理確定該作業實際上並未運行,清除其狀態並使其可以再次運行。屁股疼痛,但它始終如一地工作。 – DarinH 2011-05-27 14:27:39
儘管 – DarinH 2011-05-27 14:27:59