) В настоящее время я использую подобный код, чтобы определить, выполняется ли задание SQL-сервера. (это это SQL Server 2005, все SP ' s)
return (select isnull(
(select top 1 CASE
WHEN current_execution_status = 4 THEN 0
ELSE 1
END
from openquery(devtestvm, 'EXEC msdb.dbo.sp_help_job')
where current_execution_status = 4 and
name = 'WQCheckQueueJob' + cast(@Index as varchar(10))
), 1)
)
Проблем нет, и, вообще говоря, все работает отлично.
Но .... (всегда но)
Иногда я вызываю это и возвращаюсь к ответу: "работа не running "результат, после чего я попытаюсь запустить задание через
exec msdb.dbo.sp_start_job @JobName
, и SQL вернет, что" SQLAgent отказался запустить задание, потому что у него уже есть ожидающий запрос ".
Хорошо. Тоже не проблема. Вполне возможно, что есть небольшое окно, в котором целевое задание может быть запущено до того, как этот код сможет его запустить, но после проверки, запущено ли оно. Тем не менее, я могу просто заключить это в уловку попытки и просто проигнорировать ошибку, верно?
begin try
if dbo.WQIsQueueJobActive(@index) = 0 begin
exec msdb.dbo.sp_start_job @JobName
break
end
end try begin catch
-- nothing here
end catch
вот в чем проблема.
В 9 случаях из 10 это работает нормально. Агент SQL выдаст ошибку, она будет обнаружена, и обработка просто продолжится, поскольку задание уже выполняется, без вреда для себя.
Но иногда я получаю сообщение в представлении истории заданий (помните о приведенном выше коде, чтобы определить, выполняется ли конкретное задание, и запустить его, если на самом деле не выполняется другое задание) о том, что задание не выполнено, потому что «SQLAgent отказался запустить задание, потому что у него уже есть ожидающий запрос».
Конечно, это именно та ошибка, которую TRY CATCH должен обрабатывать!
Когда это происходит, выполняемое задание просто умирает, но не сразу, насколько я могу судить, просто довольно близко. Я повсюду веду журналы, и нет никакой последовательности. Один раз он выйдет из строя, он будет в месте a, в следующий раз в месте b. В некоторых случаях между местом A и местом B нет ничего, кроме
select @var = 'message'
. Очень странный. В основном, Текущий поток управления выглядит следующим образом: