2015-06-25 2 views
1

У меня есть хранимая процедура USP_A с логикой, как следующее:msdb.dbo.sp_start_job застрял в хранимой процедуре

...... 
exec dbo.usp_Log 'Start to run job job1' 
Exec @intErrorCode = msdb.dbo.sp_start_job 'job1' 
    IF @intErrorCode <> 0 Goto errorHandling 
exec dbo.usp_Log 'End to run job job1' 
...... 

Но когда я запускаю эту хранимую процедуру, она застряла, и когда я проверяю журнал я могу только см. сообщение «Начать выполнение задания 1». Также на мониторе заданий агента SQL Server я не вижу, чтобы это задание запускалось.

Но если я вручную запустить

Exec @intErrorCode = msdb.dbo.sp_start_job 'job1' 

он работает отлично.

Сервер SQL является Microsoft SQL Server 2005 Enterprise Edition (версия 9.00.5000.00)

ответ

1

Оказывается, это какая-то ошибка SQL Server (возможно, SQL Server 2005 довольно старый). Хранимая процедура только что закончилась неожиданно и не возвращает никакого кода.

Таким образом, проблема решена путем перемещения всей логики до этой процедуры msdb.dbo.sp_start_job в отдельную хранимую процедуру.

Надеюсь, это поможет любому, кто получил эту же проблему.

0

Ваша работа, вероятно, не в состоянии начать и ветвления в errorHandling части вашего кода. Если вы сначала добавите @@ERROR_MESSAGE в журнал, вы увидите проблему в своем журнале. Что-то вроде:

exec dbo.usp_Log 'Start to run job job1' 
begin try 
    Exec @intErrorCode = msdb.dbo.sp_start_job 'job1' 
end try 
begin catch 
    exec dbo.usp_Log 'Error: ' + ERROR_MESSAGE() 
    Goto errorHandling 
end catch 
exec dbo.usp_Log 'End to run job job1' 

UPDATE

Я провел тест на моем сервере. Я попытался запустить задание, которое уже было запущено, и была возвращена ошибка, но не вызвала блокировку catch. По-видимому, это проблема с sp_start_job. Это может быть источником некоторой вашей путаницы. Существует обходное решение, размещенное здесь: TRY/CATCH does not work on SQL Server Agent error?

Мое лучшее предположение, однако, заключается в том, что существует проблема с разрешением, когда код выполняется в другом пользовательском контексте. Вы можете обернуть код для выполнения задания в процедуру, которая выполняется под другим контекстом безопасности ... как это:

create procedure dbo.sp_RunJob1 
with execute as owner 
as 
exec sp_start_job @job_name = 'job1' 

Затем вызовите sp_RunJob1 вместо инструкции sp_start_job в коде.

+1

Но в моей секции errorHandling он не записывает никаких журналов ошибок. И если я просто запускаю этот Exec @intErrorCode = msdb.dbo.sp_start_job 'job1', он отлично работает. – mhan0125

+0

Попробуйте использовать синтаксис BEGIN TRY. Он более надежен при ошибках захвата. См. Http://stackoverflow.com/questions/1111501/error-and-or-try-catch –

+0

Возможно, что он не работает в другом пользовательском контексте, который не имеет права запускать процедуру sp_start_job ... но до тех пор, пока вы увидите сообщение об ошибке, о котором вы точно не знаете. –

Смежные вопросы