12

Acabo de ejecutar un trabajo de SQL Server programado durante más tiempo de lo normal, y realmente podría haber hecho con establecer un tiempo de espera para detenerlo después de un cierto período de tiempo.Tiempo de espera del trabajo de SQL Server Agent

Podría estar siendo un poco ciego en esto, pero parece que no puedo encontrar una manera de establecer un tiempo de espera para un trabajo. ¿Alguien sabe la manera de hacerlo?

Gracias

+1

+1 No existe una aparente propiedad "tiempo de espera" en el editor de trabajo. Estoy interesado en lo que las personas piensan. – Tomalak

+0

Creo que tendrías que agregar una configuración tipo WAITFOR en el SQL. –

Respuesta

10

Hacemos algo así como el código de abajo como parte de un subsistema de procesamiento de tareas cada noche - es más complicado que esto en realidad en la realidad; por ejemplo, estamos procesando varios conjuntos interdependientes de puestos de trabajo, y leemos en los nombres de trabajo y los valores de tiempo de espera de las tablas de configuración - pero esto capta la 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

¿Qué tipo de trabajo es este? Es posible que desee considerar poner todo el trabajo en una secuencia de comandos TSQL dentro de un ciclo While. La condición para verificar obviamente sería la diferencia de tiempo entre la hora actual y la hora de inicio del trabajo.

Raj

+0

Con este trabajo específico, podría dividirlo ... Esperaba que pudiera haber una solución "adecuada". Gracias –

Cuestiones relacionadas