Как перехватить сообщение об ошибке, возвращаемое со связанного сервера?

Как я могу перехватить сообщение об ошибке, возвращаемое со связанного сервера?

Например, если я запускаю следующую команду в SQL Server Management Studio:

BEGIN TRY
 exec ('select * from xxx') at my_linked_server
END TRY

BEGIN CATCH
  print  'ErrorNumber...'+  CAST(ERROR_NUMBER() as varchar)
  print  'ErrorSeverity...'+  CAST(ERROR_SEVERITY() as varchar)
  print  'ErrorState...'+  CAST(ERROR_STATE() as varchar)
  print  'ErrorProcedure...'+ IsNull(ERROR_PROCEDURE(),'')
  print  'ErrorLine...'+  CAST(ERROR_LINE() as varchar)
  print  'ErrorMessage...'+  IsNull(ERROR_MESSAGE(),'')
END CATCH

Я получаю следующие результаты:

Поставщик OLE DB «MSDASQL» для связанного сервера «my_linked_server» вернул сообщение «[Informix] [Драйвер Informix ODBC] [Informix] Указанная таблица (xxx) отсутствует в базе данных.». ErrorNumber...7215 ErrorSeverity...17 ErrorState...1 ErrorProcedure... ErrorLine...3 ErrorMessage...Не удалось выполнить оператор на удаленном сервере "my_linked_server".

Сохраняет ли SQL Server ошибку поставщика OLE DB? (Было бы полезно зафиксировать эту информацию для отладки.)


person llihp    schedule 30.01.2010    source источник
comment
@jjj - это может в равной степени относиться и к сфере разработки.   -  person Marc Gravell    schedule 31.01.2010
comment
этот вопрос со вчерашнего дня и нет ответов....!! ..OoO..я бы дал что-нибудь полезное   -  person jjj    schedule 01.02.2010


Ответы (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 12.11.2012