Appel d'un travail SQL Server dans un autre travail

10

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, donc cela prendrait du temps d'ajouter les étapes manuellement.

Toute suggestion est appréciée.

Ciel
la source

Réponses:

7
  • Cliquez avec le bouton 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
WrinkleFree
la source
14

Option 1

Dans Job2, créez une étape de travail de type Commande TSQL. Dans le contenu, faites-le exécuter 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 que ce travail commencé se termine. 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.

billinkc
la source
Merci pour votre réponse. Il semble que nous devons opter pour l'option 2. Je ne suis pas sûr de bien l'avoir bien comprise. Voulez-vous dire que je devrais créer les scripts pour les deux travaux, puis ajouter les étapes de travail2 à la fin de travail1? Est-ce correct?
Sky
6

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
Chris Harland
la source
Cela a été utile pour nous, où nous devions retarder l'exécution d'un deuxième travail (qui s'exécute le lendemain) en fonction de l'exécution du premier travail tard dans la soirée.
James D
J'exécute un travail SYNC (quotidien) et incrémentiel (horaire) et cela m'a aidé à garder un contrôle sur l'incrémentiel et à attendre qu'il soit terminé pour exécuter le SYNC.
snp.it