SQL Server 代理作业超时

Posted

技术标签:

【中文标题】SQL Server 代理作业超时【英文标题】:SQL Server Agent Job Timeout 【发布时间】:2010-12-07 23:57:43 【问题描述】:

我刚刚有一个预定的 SQL Server 作业运行时间比正常时间长,我真的可以设置超时以在一定时间后停止它。

我可能对此有点盲目,但我似乎找不到为工作设置超时的方法。有人知道怎么做吗?

谢谢

【问题讨论】:

+1 作业编辑器中没有明显的“超时”属性。我对人们的想法很感兴趣。 我认为您必须在 SQL 中添加 WAITFOR 类型的设置。 【参考方案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

【讨论】:

【参考方案2】:

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

拉吉

【讨论】:

有了这个特定的工作,我可以把它分开......我只是希望可能有一个“合适的”解决方案。谢谢

以上是关于SQL Server 代理作业超时的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER代理作业

SQL Server代理(11/12):维护计划作业

SQL Server代理(10/12):使用代理账号运行作业

无法在 sql server 代理中运行作业

初识SQL Server代理&作业

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