2012-09-03 159 views
21

需要有一個調用SQL Server代理作業,並返回作業是否未成功或不跑了存儲過程。從存儲過程執行SQL Server代理作業,並返回作業結果

到目前爲止,我有

CREATE PROCEDURE MonthlyData 
AS 
EXEC msdb.dbo.sp_start_job N'MonthlyData' 

WAITFOR DELAY '000:04:00' 

EXEC msdb.dbo.sp_help_jobhistory @job_name = 'MonthlyData' 
GO 

這將啓動工作,什麼取回如果作業成功與否跑出的最好方法是什麼?

好做了編輯,並使用WAITFOR DELAY作爲作業通常3-4分鐘之間的運行速度比4.永遠不再做這項工作,但有一個更有效的方式來做到這一點?

回答

19

您可以運行查詢:

EXEC msdb.dbo.sp_help_jobhistory 
    @job_name = N'MonthlyData' 

它會返回一個列run_status。狀態有:

0 - Failed 
1 - Succeeded 
2 - Retry 
3 - Canceled   

更多信息上MSDN

編輯:您可能要輪詢你的工作,並確保它的執行。你可以從sp_help_job過程信息。當這個過程返回的4狀態就意味着工作處於閒置狀態。 然後,它的安全檢查它的運行狀態。

您可以查詢使用下面的代碼:

DECLARE @job_status INT 
SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=.;Trusted_Connection=yes;','exec msdb.dbo.sp_help_job @job_name = ''NightlyBackups''') 

WHILE @job_status <> 4 
BEGIN 
    WAITFOR DELAY '00:00:03' 
    SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=.;Trusted_Connection=yes;','exec msdb.dbo.sp_help_job @job_name = ''NightlyBackups''') 
END 

EXEC msdb.dbo.sp_help_jobhistory 
    @job_name = N'NightlyBackups' ; 
GO 

此代碼將檢查狀態,等待3秒,然後重試。一旦我們得到的4個狀態,我們知道工作已經完成,它的安全檢查工作歷史。

+1

你可能想表明你基本上需要進行民意調查,直到有問題的工作達到了「最終狀態」。 –

+0

因此,一旦我開始工作,我需要進行民意調查,直到工作完成,然後執行職業史? – DtotheG

+0

@ChristianK你能告訴我們更多關於輪詢Job Agent的信息嗎? – testing

19

對於所有你們誰是不允許使用OPENROWSET命令,這可能幫助。我發現一開始我這裏的解決方案:

http://social.msdn.microsoft.com/Forums/en-US/89659729-fea8-4df0-8057-79e0a437b658/dynamically-checking-job-status-with-tsql

這依賴於一個事實,即msdb.dbo.sysjobactivity表的一些列的一種方式或其他作業結束後首先得到填充。

-- Start job 
DECLARE @job_name NVARCHAR(MAX) = 'JobName' 
EXEC msdb.dbo.sp_start_job @job_name = @job_name 


-- Wait for job to finish 
DECLARE @job_history_id AS INT = NULL 

WHILE @time_constraint = @ok 
BEGIN 
    SELECT TOP 1 @job_history_id = activity.job_history_id 
    FROM msdb.dbo.sysjobs jobs 
    INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id 
    WHERE jobs.name = @job_name 
    ORDER BY activity.start_execution_date DESC 

    IF @job_history_id IS NULL 
    BEGIN 
     WAITFOR DELAY '00:00:10' 
     CONTINUE 
    END 
    ELSE 
     BREAK 
END 


-- Check exit code 
SELECT history.run_status 
FROM msdb.dbo.sysjobhistory history 
WHERE history.instance_id = @job_history_id 

您可能想要檢查WHILE循環允許運行多長時間。我選擇將這部分保留在範例之外。

的退出代碼等: http://technet.microsoft.com/en-us/library/ms174997.aspx

0

微軟指導我可能是有點晚了,但我發現下面的查詢爲我工作。它會給執行時間和執行結束時間。你可以改變它以獲得狀態。

SELECT 
    job.name, 
    job.job_id, 
    job.originating_server, 
    activity.run_requested_date, 
    activity.stop_execution_date, 
    DATEDIFF(SECOND, activity.run_requested_date, activity.stop_execution_date) as Elapsed 
FROM msdb.dbo.sysjobs_view job 
JOIN msdb.dbo.sysjobactivity activity ON job.job_id = activity.job_id 
JOIN msdb.dbo.syssessions sess ON sess.session_id = activity.session_id 
JOIN 
( 
    SELECT 
    MAX(agent_start_date) AS max_agent_start_date 
    FROM 
    msdb.dbo.syssessions 
) sess_max 
ON sess.agent_start_date = sess_max.max_agent_start_date 
WHERE run_requested_date IS NOT NULL 
--AND stop_execution_date IS NULL 
AND job.name = @JobName 
相關問題