Я на самом деле должен был сделать это в последнее время, и это, как я думаю о его реализации. Я создаю временную работу через sp_add_job и sp_add_jobstep и устанавливаю @delete_level в 3 (всегда удаляем после запуска).
Я не на 100% продаю этот подход, как вы, вероятно, можете сказать из названия хранимой процедуры. Тем не менее, это не работа:
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
Конечно, вы хотите поместить в какой-то код, чтобы убедиться, что есть максимальное количество раз это будет RECURSE, но вы получите идею. Вы также можете передать параметр, чтобы контролировать, как часто происходит рекурсия. В моем случае, через десять секунд, результаты не имеют смысла.
То, что я здесь делаю, может быть изменено для заданий, которые не должны быть немедленно удалены после выполнения, изменяя критерии выбора, чтобы проверить статус выполнения задания, например, sp_help_job, проходящий @job_name или @ job_id и @execution_status = 0.
Я предпочел бы остаться в документированной земли. Мне известно о sp_help_jobs, однако это отвратительно, так как, по моему мнению, мне нужно прочитать набор результатов в таблице temp, а затем выбрать из этого. Я искал что-то немного чище, хотя это сработало бы. – 2008-12-16 16:42:16