15

スケジュールされた SQL Server ジョブを通常よりも長く実行したばかりで、タイムアウトを設定して一定時間後にジョブを停止することもできたはずです。

私はこれについて少し盲目であるかもしれませんが、ジョブのタイムアウトを設定する方法を見つけることができないようです. 誰もそれを行う方法を知っていますか?

ありがとう

4

2 に答える 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
于 2009-10-19T15:16:04.807 に答える
2

これはどんな仕事ですか?ジョブ全体をWhileループ内のTSQLスクリプトに入れることを検討することをお勧めします。チェックする条件は、明らかに現在時刻とジョブ開始時刻の時差です。

ラージ

于 2009-10-19T13:32:27.657 に答える