Llamar a un trabajo de SQL Server dentro de otro trabajo

10

¿Es posible llamar a un trabajo de SQL Server para ejecutarlo dentro de otro trabajo?

Sé que podemos agregar todos los pasos del Trabajo 1 al Trabajo 2, pero prefiero no hacerlo. Primero, el Job 2 ya es bastante grande y, en segundo lugar, no pude encontrar una opción de copiar y pegar para copiar los pasos entre los trabajos, por lo que tomaría mucho tiempo agregar los pasos manualmente.

Cualquier sugerencia es apreciada.

Cielo
fuente

Respuestas:

7
  • Haga clic con el botón derecho en el trabajo cuyos pasos desea agregar y seleccione "Trabajo de script como-> Crear en nueva ventana de consulta", en el script resultante busque todas las secciones que tengan este formato
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'<stepname>', 
  @step_id=1, 
  @cmdexec_success_code=0, 
  @on_success_action=3, 
  @on_success_step_id=0, 
  @on_fail_action=2, 
  @on_fail_step_id=0, 
  @retry_attempts=0, 
  @retry_interval=0, 
  @os_run_priority=0, @subsystem=N'TSQL', 
  @command=N'<code>', 
  @database_name=N'', 
  @flags=0
  • Abra una nueva ventana de consulta y ejecute esto:
DECLARE @jobId BINARY(16)
    SET @jobId = (SELECT job_id FROM msdb.dbo.sysjobs WHERE name = '<job name, to which you want to copy the steps>')

-- Followed by all the msdb.dbo.sp_add_jobstep from the script that scripted out in the earlier step

    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'<stepname>', 
      @step_id=1, 
      @cmdexec_success_code=0, 
      @on_success_action=3, 
      @on_success_step_id=0, 
      @on_fail_action=2, 
      @on_fail_step_id=0, 
      @retry_attempts=0, 
      @retry_interval=0, 
      @os_run_priority=0, @subsystem=N'TSQL', 
      @command=N'<code>', 
      @database_name=N'', 
      @flags=0
Libre de arrugas
fuente
14

Opción 1

En Job2, cree un paso de trabajo del tipo Comando TSQL. En el contenido, haga que ejecute el trabajo existente ( sp_start_job )

EXECUTE msdb.dbo.sp_start_job 'Job1'

Eso se ejecutará de forma asincrónica, por lo tanto, después de que inicie las llamadas al procedimiento almacenado, volverá y realizará el siguiente paso en el trabajo. No esperará a que se complete el trabajo iniciado. Si el trabajo llamado falla, no volverá a filtrarse al trabajo de invocación.

opcion 2

Haga clic derecho en Job1 y guión a la nueva ventana de consulta. Repita eso con Job2 y luego enhebre los pasos del trabajo de 1 a 2 según sea necesario. Mucho menos clics que recrear la rueda y, con suerte, menos propensos a errores.

billinkc
fuente
Gracias por su respuesta. Parece que tenemos que ir a la Opción 2. Sin embargo, no estoy muy seguro de si lo entendí correctamente. ¿Quiere decir que debería crear los scripts para ambos trabajos y luego agregar los pasos del trabajo2 al final del trabajo1? ¿Está bien?
Cielo
6

De stackoverflow (mafafu)

WAITFOR DELAY '00:00:02';
while exists (select * from msdb.dbo.sysjobs j 
                inner join msdb.dbo.sysjobactivity a on j.job_id = a.job_id 
                where name = 'Job 1' 
                and stop_execution_date is null and start_execution_date is not null)
begin
    PRINT 'Waiting...'
    WAITFOR DELAY '00:00:02';   
end
Chris Harland
fuente
Esto fue útil para nosotros, ya que necesitábamos retrasar la ejecución de un segundo trabajo (que se ejecuta al día siguiente) en función de la ejecución del primer trabajo a última hora de la tarde.
James D
Estoy ejecutando un trabajo SYNC (diario) e incremental (por hora) y esto me ayudó a mantener un control del incremental y esperar hasta que termine para ejecutar el SYNC.
snp.it