SQL Server代理作业超时(SQL Server Agent Job Timeout)

2019-08-20 09:16发布

我刚才已经为超过正常计划的SQL Server作业运行,我真的可以具有由具有设置超时时间一定长度后停止完成它。

我可能是在这一点盲目的,但我似乎无法找到设置超时工作的一种方式。 有谁知道这样做的方式吗?

谢谢

Answer 1:

我们这样做下面的代码为夜间作业处理子系统的一部分 - 它比这其实在现实中更复杂; 例如,我们正在处理多个相互依赖组的工作,并从配置表中的作业名称和超时值读 - 但是这抓住了主意:

    DECLARE @JobToRun NVARCHAR(128) = 'My Agent Job'
DECLARE @dtStart DATETIME = GETDATE(), @dtCurr DATETIME
DECLARE @ExecutionStatus INT, @LastRunOutcome INT, @MaxTimeExceeded BIT = 0
DECLARE @TimeoutMinutes INT = 180 

EXEC msdb.dbo.sp_start_job @JobToRun
SET @dtCurr = GETDATE()
WHILE 1=1
BEGIN
    WAITFOR DELAY '00:00:10'
    SELECT @ExecutionStatus=current_execution_status, @LastRunOutcome=last_run_outcome 
    FROM OPENQUERY(LocalServer, 'set fmtonly off; exec msdb.dbo.sp_help_job') where [name] = @JobToRun
    IF @ExecutionStatus <> 4
    BEGIN -- job is running or finishing (not idle)
        SET @dtCurr=GETDATE()
        IF DATEDIFF(mi, @dtStart, @dtCurr) > @TimeoutMinutes
        BEGIN   
            EXEC msdb.dbo.sp_stop_job @job_name=@JobToRun                   
            -- could log info, raise error, send email etc here
        END
        ELSE
        BEGIN
            CONTINUE
        END
    END
    IF @LastRunOutcome = 1  -- the job just finished with success flag
    BEGIN
        -- job succeeded, do whatever is needed here
        print 'job succeeded'                                   
    END

END


Answer 2:

什么样的工作,这是? 您可能要考虑将整个工作在TSQL脚本While循环中。 要检查的条件显然是当前时间和作业开始时间之间的时间差。

拉吉



文章来源: SQL Server Agent Job Timeout