2012-09-03 129 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 
相关问题