web-dev-qa-db-fra.com

Appel d'un travail SQL Server dans un autre travail

Est-il possible d'appeler un travail SQL Server pour s'exécuter dans un autre travail?

Je sais que nous pouvons ajouter toutes les étapes du travail 1 au travail 2, mais je préfère ne pas le faire. Premièrement, le Job 2 est déjà assez volumineux et deuxièmement, je n'ai pas pu trouver une option copier-coller pour copier les étapes entre les jobs, il serait donc long d'ajouter les étapes manuellement.

Toute suggestion est appréciée.

10
Sky
  • Faites un clic droit sur le travail dont vous souhaitez ajouter les étapes et choisissez "Script de travail en tant que-> Créer dans une nouvelle fenêtre de requête", dans le script résultant, recherchez toutes les sections qui ont ce format
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
  • Ouvrez une nouvelle fenêtre de requête et exécutez ceci:
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
7
WrinkleFree

Option 1

Dans Job2, créez une étape de travail de type Commande TSQL. Dans le contenu, exécutez le travail existant ( sp_start_job )

EXECUTE msdb.dbo.sp_start_job 'Job1'

Cela va s'exécuter de manière asynchrone, donc après avoir démarré les appels de la procédure stockée, il reviendra et effectuera l'étape suivante du travail. Il n'attendra pas la fin de cette tâche. Si le travail appelé échoue, il ne reviendra pas au travail appelant.

Option 2

Faites un clic droit sur Job1 et le script pour ouvrir une nouvelle fenêtre de requête. Répétez cela avec Job2, puis enfilez les étapes de travail de 1 à 2 selon les besoins. Beaucoup moins de clics que de recréer la roue et, espérons-le, moins sujet aux erreurs.

14
billinkc

Depuis 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
6
Chris Harland