12

スケジュールされたSQL Serverジョブが通常より長く実行されたばかりで、一定の時間が経過した後にタイムアウトを設定することができました。SQL Serverエージェントのジョブタイムアウト

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

ありがとうございました

+1

1ジョブエディタでは明らかな「タイムアウト」プロパティはありません。私は人々が思いつくものに興味があります。 – Tomalak

+0

私はWAITFOR型の設定をSQLに追加しなければならないと思います。 –

答えて

10

私たちは、毎晩ジョブ処理サブシステムの一部として、以下のコードのような何かをする - それが現実に実際にこれよりも複雑です。例えば、我々は仕事の複数の相互依存のセットを処理し、構成テーブルからジョブ名とタイムアウト値を読み込まれる - しかし、これはアイデアをキャプチャ:

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 @[email protected]     
      -- 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スクリプトに入れることを検討することをお勧めします。チェックする条件は、明らかに現在の時刻とジョブの開始時刻との時差です。

ラジ

+0

この特定の仕事で、私はそれを分けることができました...私はちょうど "適切な"解決策があるかもしれないことを望んでいました。 ありがとう –

関連する問題