SQL Server代理作业超时

15

我刚刚运行了一个计划好的SQL Server作业,花费的时间比平时长,设置一个超时时间以在一定时间后停止它会很有帮助。

也许我有点糊涂,但似乎找不到为作业设置超时的方法。 请问有人知道该如何设置吗?

谢谢


1
在作业编辑器中似乎没有明显的“超时”属性。我很想知道人们能想出什么。 - Tomalak
我认为你需要在SQL中添加WAITFOR类型的设置。 - user114600
2个回答

13

作为夜间作业处理子系统的一部分,我们执行以下类似于下面的代码-实际上比这更加复杂; 例如,我们正在处理多个相互依赖的作业集,并从配置表中读取作业名称和超时值-但这捕捉了这个想法:

    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
这是什么样的工作?您可能需要考虑将整个工作放在一个TSQL脚本中,并在While循环内执行。检查的条件显然是当前时间和作业开始时间之间的时间差。
Raj

对于这个具体的工作,我可以将其分解成几个部分... 我只是希望有一个“正式”的解决方案。 - Iain Hoult

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接