TRY CATCH с подключенным сервером в SQL Server 2005 не работает - PullRequest
3 голосов
/ 24 марта 2010

Я пытаюсь отловить ошибку sql, возникающую при выполнении хранимой процедуры на связанном сервере. Оба сервера работают под управлением SQL Server 2005.

Чтобы доказать проблему, я создал хранимую процедуру на связанном сервере с именем Raise error, которая выполняет следующий код:

RAISERROR('An error', 16, 1);

Если я выполняю хранимую процедуру непосредственно на связанном сервере, используя следующий код, я получаю набор результатов с ошибкой '16', как и ожидалось (т. Е. Код входит в блок catch):

BEGIN TRY
EXEC [dbo].[RaiseError];
END TRY
BEGIN CATCH
    DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int;
    SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY();
    SELECT @ErrMsg, @ErrSeverity;
END CATCH

Если я запускаю следующий код на локальном сервере для выполнения хранимой процедуры на связанном сервере, SSMS выдает мне сообщение «Запрос завершен с ошибками», .Msg 50000, Уровень 16, Состояние 1, Процедура RaiseError, Строка 13 Ошибка '

BEGIN TRY
    EXEC [Server].[Catalog].[dbo].RaiseError
END TRY
BEGIN CATCH
    DECLARE @SPErrMsg nvarchar(4000), @SPErrSeverity int;
    SELECT @SPErrMsg = ERROR_MESSAGE(), @SPErrSeverity = ERROR_SEVERITY();
    SELECT @SPErrMsg, @SPErrSeverity;
END CATCH

Мой вопрос: можно ли отловить ошибку, сгенерированную при выполнении хранимой процедуры на связанном сервере?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 24 марта 2010

См. Обработка ошибок в удаленных хранимых процедурах между серверами :

Вызов RAISERROR с серьезностью меньше чем 20 изнутри удаленного хранится процедура вызывает прерывание оператора ошибка на удаленном сервере. TRY… CATCH построить на местном сервер обрабатывает удаленный пакетный прерывание только ошибки. Если пульт хранится процедура вызывает RAISERROR с Степень тяжести менее 20 и дистанционное хранимая процедура находится в пределах Блок TRY на локальном сервере, RAISERROR не вызывает контроль перейти к блоку CATCH TRY… CATCH построить. Тем не мение, RAISERROR со степенью серьезности 20 или выше на удаленном сервере ломает подключение и исполнение на местном сервер переходит в блок CATCH.

3 голосов
/ 28 мая 2013

Возвращает информацию об ошибке локально:

EXEC ('your.fullyqualified.storedprocname') AT YOUR_LINKED_SERVER;
...