我有使用sp_start_job調用其他10個就業機會一個SQL Server作業。這項工作有10個步驟,每一步都是再次調用子作業。SQL代理任務 - 執行的隊列
當我執行的主要工作,我可以看到它開始與步驟1中,並在其中顯示幾秒鐘「成功完成」。
但工作需要很長時間的運行時間,當我驗證日誌信息,它顯示了所有的10個步驟是在後面同時運行,直到幾個小時後結束。
我的要求是,它應該完成步驟1第一個也是唯一然後第二步應該開始。
我有使用sp_start_job調用其他10個就業機會一個SQL Server作業。這項工作有10個步驟,每一步都是再次調用子作業。SQL代理任務 - 執行的隊列
當我執行的主要工作,我可以看到它開始與步驟1中,並在其中顯示幾秒鐘「成功完成」。
但工作需要很長時間的運行時間,當我驗證日誌信息,它顯示了所有的10個步驟是在後面同時運行,直到幾個小時後結束。
我的要求是,它應該完成步驟1第一個也是唯一然後第二步應該開始。
的Microsoft Code論壇有辦法來檢查,如果存儲過程運行。你可以用它來等待,直到作業完成:
while 1=1
begin
WAITFOR DELAY '000:00:10'
if not exists (
SELECT *
FROM master..sysprocesses p
JOIN msdb..sysjobs j ON
substring(left(j.job_id,8),7,2) +
substring(left(j.job_id,8),5,2) +
substring(left(j.job_id,8),3,2) +
substring(left(j.job_id,8),1,2) =
substring(p.program_name,32,8)
WHERE j.name = 'YourJobName'
AND program_name like 'SQLAgent - TSQL JobStep (Job %'
)
break
end
這樣的代碼工作原理是,它等待10秒鐘,然後如果作業YourJobName運行檢查。它重複說明,直到工作不再運行。你可以把它放在sp_start_job調用之間。
話雖如此,必須有一個更簡單的方法。你不能在存儲過程中存儲10個作業中的每一個的代碼嗎? 「主」作業可以調用10個存儲過程,而不是啓動10個作業。
我的第一個答案是,你可以使用一個循環如上但檢查中MSDB作業歷史記錄表,等待前面的作業完成:
select sj.name as job_name
from msdb.dbo.sysjobhistory sjh
inner join msdb.dbo.sysjobs_view sj on sj.job_id = sjh.job_id
where sjh.step_id = 0 --Job outcome
and sjh.run_status = 4 --In progress
感謝,Andomar,質疑這一點。事實證明,sysjobhistory只有在第一步完成後纔會更新。只有一個白癡會想象,如果run_status的一個值是'正在進行',那麼當一個步驟開始時,該表必須被更新!我已經四處搜尋,這似乎是一個棘手的問題。某處SQL知道發生了什麼,但它不會很好地顯示信息。
看來你有複雜的代碼英里或使用無證存儲過程之間進行選擇。您可以通過Google搜索sysjobhistory輕鬆地找到代碼數英里的答案 - 有幾個。我個人更喜歡XP的方法:
create table #xp_results(
job_id uniqueidentifier not null,
last_run_date int not null,
last_run_time int not null,
next_run_date int not null,
next_run_time int not null,
next_run_schedule_id int not null,
requested_to_run int not null, -- bool
request_source int not null,
request_source_id sysname collate database_default null,
running int not null, -- bool
current_step int not null,
current_retry_attempt int not null,
job_state int not null)
insert #xp_results exec master.dbo.xp_sqlagent_enum_jobs @is_sysadmin = 1, @job_owner = ''
select sj.name
from #xp_results xpr
inner join msdb.dbo.sysjobs_view sj on sj.job_id = xpr.job_id
where running = 1
drop table #xp_results
我測試過這個,它確實似乎工作。使用這個XP也許是有風險的,但這就是Job Activity Monitor所使用的 - 我將它與Profiler一起運行 - 所以如果它改變了,它們可能會提供其他方式來查找此信息。只要你把這個代碼包裝在一個函數或者proc中,並且記錄下你對它有依賴,那麼對我來說,這似乎是最少的一個。
在我的SQL Server上,它列出了幾小時前完成的作業 – Andomar 2009-10-29 06:14:01