realidad que tenía que hacer esto recientemente, y esto es lo que estoy pensando en implementarlo. Estoy creando un trabajo temporal a través de sp_add_job y sp_add_jobstep, y estableciendo @delete_level en 3 (siempre elimine después de la ejecución).
No estoy 100% vendido en este enfoque, como probablemente pueda deducir del título del procedimiento almacenado. Sin embargo, funciona:
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
Por supuesto, tendrá que poner en un cierto código para asegurarse de que hay un número máximo de veces que esto son recursivos, pero se entiende la idea. También puede pasar un parámetro para controlar la frecuencia con que ocurre la recursión. En mi caso, después de diez segundos, los resultados no tienen sentido.
Lo que hago aquí podría modificarse para trabajos que no están destinados a descartarse inmediatamente después de la ejecución cambiando los criterios de selección para verificar el estado de ejecución del trabajo, por ejemplo, con sp_help_job pasando @job_name o @ job_id y @execution_status = 0.
preferiría quedarse en tierra documentado. Soy consciente de sp_help_jobs, sin embargo, es algo feo, ya que, desde mi comprensión, necesito leer el conjunto de resultados en una tabla temporal y seleccionar desde allí. Estaba buscando algo un poco más limpio, aunque esto funcionaría. –