Перехват ошибок через связанный сервер с серьезностью ‹ 20

У меня проблема, аналогичная этому вопросу: ПОПРОБУЙТЕ CATCH со связанным сервером в SQL Server 2005, не работает

Я запускаю эту попытку:

    Declare @command nvarchar(100)
    SET @command = 'SELECT column FROM table'
    BEGIN TRY
        BEGIN TRY
            exec ' + @Server_Name + @DB_name + '.dbo.sp_executesql @command
    END TRY
    BEGIN CATCH
        PRINT EXCEPTION
    END CATCH

Я не думаю, что могу использовать RAISEERROR, потому что я не запускаю свою собственную хранимую процедуру, я запускаю только простой оператор выбора. Я пытался использовать @@ERROR, но это также не работает на связанном сервере. Поскольку ошибка, которую я получаю, меньше 20, я столкнулся с этой проблемой:

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

http://msdn.microsoft.com/en-us/library/ms191515.aspx

Я нашел этот вопрос: Как перехватить сообщение об ошибке возвращен со связанного сервера?, на который также нет ответа.


person sixshift04    schedule 09.11.2012    source источник


Ответы (1)


Я узнал, как обойти это, передав try catch связанному серверу и вернув ошибку, используя параметр OUTPUT. Например:

SET @command = '
BEGIN TRY
    exec (''select * from xxx'') 
    SELECT @resultOUT = @@ERROR
END TRY
BEGIN CATCH
    SELECT @resultOUT = @@ERROR
END CATCH'
SET @ParmDefinition = N'@resultOUT nvarchar(5) OUTPUT'
exec my_linked_server.sp_executesql 
    @command, 
    @ParmDefinition, 
    @resultOUT=@result OUTPUT
person sixshift04    schedule 19.11.2012