如何捕获从链接服务器返回的错误消息?

时间:2010-01-30 14:36:53

标签: sql-server error-handling linked-server

如何捕获从链接服务器返回的错误消息?

例如,如果我在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

我得到以下结果:

  

链接服务器“my_linked_server”的OLE DB提供程序“MSDASQL”返回消息“[Informix] [Informix ODBC Driver] [Informix]指定的表(xxx)不在数据库中。”   ErrorNumber ... 7215   ErrorSeverity ... 17   ErrorState ...... 1   ErrorProcedure ...   ErrorLine ... 3   ErrorMessage ...无法在远程服务器'my_linked_server'上执行语句。

SQL Server是否存储OLE DB提供程序错误? (捕获此信息以进行调试将非常有用。)

1 个答案:

答案 0 :(得分:0)

我有同样的问题。我发现了如何通过将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