12

Ich hatte gerade einen geplanten SQL Server-Job länger als normal ausgeführt, und ich hätte wirklich eine Zeitüberschreitung einstellen können, um ihn nach einer gewissen Zeit zu stoppen.Zeitlimit für SQL Server-Agent-Job

Ich könnte ein bisschen blind sein, aber ich kann nicht scheinen, eine Möglichkeit zu finden, eine Zeitüberschreitung für einen Job zu setzen. Kennt jemand den Weg, es zu tun?

Danke

+1

+1 Es gibt keine offensichtliche „timeout“ Eigenschaft im Job-Editor. Ich interessiere mich dafür, was Leute sich einfallen lassen. – Tomalak

+0

Ich denke, Sie müssten eine WAITFOR-Typ-Einstellung in SQL hinzufügen. –

Antwort

10

Wir tun so etwas wie den Code unten als Teil eines nächtlichen Auftragsverarbeitungsuntersystem - es ist komplizierter, als dies tatsächlich in der Realität; zum Beispiel verarbeiten wir mehr voneinander abhängige Sätze von Arbeitsplätzen und in Jobnamen und Timeout-Werten von Konfigurationstabellen lesen - aber das fängt die Idee:

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

Was für eine Arbeit ist das? Möglicherweise möchten Sie den gesamten Job in ein TSQL-Skript innerhalb einer While-Schleife einfügen. Die zu überprüfende Bedingung wäre offensichtlich die Zeitdifferenz zwischen der aktuellen Zeit und der Startzeit des Jobs.

Raj

+0

Mit diesem speziellen Job konnte ich es aufteilen ... Ich hoffte nur, dass es eine "richtige" Lösung geben könnte. Danke –

Verwandte Themen