2009-10-28 105 views
0

我有使用sp_start_job調用其他10個就業機會一個SQL Server作業。這項工作有10個步驟,每一步都是再次調用子作業。SQL代理任務 - 執行的隊列

當我執行的主要工作,我可以看到它開始與步驟1中,並在其中顯示幾秒鐘「成功完成」。

但工作需要很長時間的運行時間,當我驗證日誌信息,它顯示了所有的10個步驟是在後面同時運行,直到幾個小時後結束。

我的要求是,它應該完成步驟1第一個也是唯一然後第二步應該開始。

回答

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個作業。

0

我的第一個答案是,你可以使用一個循環如上但檢查中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中,並且記錄下你對它有依賴,那麼對我來說,這似乎是最少的一個。

+0

在我的SQL Server上,它列出了幾小時前完成的作業 – Andomar 2009-10-29 06:14:01