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.

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

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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.