从存储过程执行SQL Server代理作业并返回作业结果

Dto*_*heG 21 sql t-sql sql-server jobs sql-server-2008

需要一个调用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
Run Code Online (Sandbox Code Playgroud)

哪个开始工作,如果工作成功与否,最好的方法是什么?

确定编辑并使用了WAITFOR DELAY,因为作业通常在3-4分钟之间运行,从不超过4分.工作但是有更有效的方法吗?

lap*_*vil 20

对于那些不允许使用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
Run Code Online (Sandbox Code Playgroud)

您可能希望对WHILE循环允许运行多长时间进行一些检查.我选择将这一部分排除在榜样之外.

Microsoft退出代码等指南:http: //technet.microsoft.com/en-us/library/ms174997.aspx


Fed*_*jdu 19

您可以运行查询:

EXEC msdb.dbo.sp_help_jobhistory 
    @job_name = N'MonthlyData'
Run Code Online (Sandbox Code Playgroud)

它将返回一列run_status.状态是:

 0 - Failed
 1 - Succeeded
 2 - Retry
 3 - Canceled         
Run Code Online (Sandbox Code Playgroud)

有关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
Run Code Online (Sandbox Code Playgroud)

此代码将检查状态,等待3秒,然后重试.一旦我们获得4的状态,我们就知道工作已经完成,检查工作历史是安全的.