1

リンクサーバーから返されたエラーメッセージをキャプチャするにはどうすればよいですか?

例として、SQL Server ManagementStudioで次のコマンドを実行した場合:

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」のOLEDBプロバイダー「MSDASQL」が「[Informix][InformixODBCドライバー][Informix]指定されたテーブル(xxx)がデータベースにありません。」というメッセージを返しました。ErrorNumber ... 7215 ErrorSeverity ... 17 ErrorState ... 1 ErrorProcedure ... ErrorLine ... 3ErrorMessage...リモートサーバー'my_linked_server'でステートメントを実行できませんでした。

SQLServerはOLEDBプロバイダーエラーを保存しますか?(デバッグのためにこの情報をキャプチャすると便利です。)

4

1 に答える 1

0

私はこれと同じ問題を抱えていました。OUTPUTリンクサーバーにtry catchを渡し、パラメーターを使用してエラーを返すことで、それを回避する方法を見つけました。例えば:

    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
于 2012-11-12T23:52:44.883 に答える