J'ai dû le faire récemment, ce qui est la façon dont je pense à sa mise en œuvre. Je crée un travail temporaire via sp_add_job et sp_add_jobstep, et en définissant @delete_level sur 3 (toujours supprimer après l'exécution).
Je ne suis pas 100% vendu sur cette approche, comme vous pouvez probablement le deviner d'après le titre de la procédure stockée. Cependant, il fonctionne:
CREATE PROCEDURE spWorkaround_checkJobExists
@job_id UNIQUEIDENTIFIER
, @thisIteration tinyint
, @maxRecurse tinyint
AS
IF (@thisIteration <= @maxRecurse)
BEGIN
IF EXISTS(
select * FROM msdb.dbo.sysjobs where job_id = @job_id
)
BEGIN
WAITFOR DELAY '00:00:01'
DECLARE @nextIteration int
SET @nextIteration = @thisIteration + 1
EXEC dbo.spWorkaround_checkJobExists @job_id, @nextIteration, @maxRecurse
END
END
Bien sûr, vous aurez envie de mettre dans un certain code pour assurer qu'il ya un nombre maximum de fois cela RECURSE, mais vous voyez l'idée. Vous pouvez également passer un paramètre pour contrôler la fréquence de la récursion. Dans mon cas, après dix secondes, les résultats sont dénués de sens. Ce que je fais ici pourrait être modifié pour les tâches qui ne sont pas destinées à être supprimées immédiatement après l'exécution en changeant les critères de sélection pour vérifier l'état d'exécution du travail, par exemple, avec sp_help_job en passant @job_name ou @ job_id et @execution_status = 0.
Je préfère rester dans la terre documentée. Je suis au courant de sp_help_jobs, mais c'est un peu moche, car, d'après ce que j'ai compris, je dois lire le jeu de résultats dans une table temporaire, puis en choisir un. Je cherchais quelque chose d'un peu plus propre, bien que cela fonctionne. –