12

Ho appena eseguito un lavoro pianificato di SQL Server più a lungo del normale e avrei potuto davvero fare in modo di impostare un timeout per arrestarlo dopo un certo periodo di tempo.Timeout processo agente SQL Server

Potrei essere un po 'cieco su questo, ma non riesco a trovare un modo di impostare un timeout per un lavoro. Qualcuno conosce il modo di farlo?

Grazie

+1

+1 Non v'è alcun apparente proprietà "timeout" nell'editor di lavoro. Sono interessato a ciò che le persone inventano. – Tomalak

+0

Penso che dovresti aggiungere un'impostazione tipo WAITFOR nell'SQL. –

risposta

10

Facciamo qualcosa di simile il codice di seguito come parte di un sottosistema di elaborazione di lavoro notturno - è più complicato di questo in realtà nella realtà; per esempio stiamo elaborando più set interdipendenti di posti di lavoro, e leggere nei nomi di lavoro e valori di timeout da tabelle di configurazione - ma questo coglie l'idea:

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

Che tipo di lavoro è questo? Potresti considerare di mettere l'intero lavoro in uno script TSQL all'interno di un ciclo While. La condizione da verificare sarebbe ovviamente la differenza di orario tra l'ora corrente e l'ora di inizio del lavoro.

Raj

+0

Con questo lavoro specifico, ho potuto dividerlo ... Speravo solo che ci potesse essere una soluzione "corretta". Grazie –

Problemi correlati