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.
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
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
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.
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.
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