J'ai plusieurs travaux d'agent SQL Server qui devraient s'exécuter de manière séquentielle. Pour garder une bonne vue d'ensemble des travaux qui devraient s'exécuter, j'ai créé un travail principal qui appelle les autres travaux avec un appel à EXEC msdb.dbo.sp_start_job N'TEST1'
. Le se sp_start_job
termine instantanément (Étape 1 du travail), mais je veux que mon travail principal attende la fin du travail TEST1
avant d'appeler le prochain travail.
J'ai donc écrit ce petit script qui commence à s'exécuter juste après l'appel du travail (étape 2 du travail) et force le travail principal à attendre la fin du sous-travail:
WHILE 1 = 1
BEGIN
WAITFOR DELAY '00:05:00.000';
SELECT *
INTO #jobs
FROM OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;',
'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'',
@execution_status = 0, @job_aspect = N''JOB''');
IF NOT (EXISTS (SELECT top 1 * FROM #jobs))
BEGIN
BREAK
END;
DROP TABLE #jobs;
END;
Cela fonctionne assez bien. Mais j'ai l'impression que des WHILE 1 = 1
solutions plus intelligentes et / ou plus sûres ( ?) Devraient être possibles.
Je suis curieux de savoir ce qui suit, j'espère que vous pourrez me fournir quelques informations:
- Quels sont les problèmes avec cette approche?
- Pouvez-vous suggérer une meilleure façon de procéder?
(J'ai d'abord posé cette question sur StackOverflow , parce que je me concentrais sur l'amélioration du code. Toujours valide. Mais je suppose que les gens ici auront en général des choses plus intelligentes à dire sur les raisons pour lesquelles je ne devrais pas essayer de le faire comme je le fais. Je le fais maintenant ou offre de bonnes alternatives.)
EDIT (25 juillet)
Apparemment, il n'y a pas trop de problème avec mon script, selon le faible nombre de réponses signalant des problèmes avec celui-ci :-) L'alternative à ce type de script semble être d'utiliser un outil conçu pour ces (comme SQL Sentry Event Manager ou ...) - ou pour écrire un tel outil vous-même. Nous n'achèterons pas un tel outil dans mon entreprise actuelle, donc pour l'instant je vais simplement m'en tenir au script.