2
Begin Try
Declare @SQL NVarchar(Max)='Exec [MyLinkedServer].master.dbo.sp_executesql N''Drop Table [tempdb].dbo.[T1]''';
Print   @SQL;
Exec master.dbo.sp_executesql @SQL;
End Try
Begin Catch
Print Error_Message()
End Catch

上記のスクリプトは、テーブル T1 が MyLinkedServer に存在しない場合に失敗し、Catch セクションに送られません。何が恋しいですか?

明確にするために、元のプロシージャは、パラメータを使用してプロシージャ内で @SQL を動的に構築します。

ありがとう!

4

1 に答える 1

1

いいえ、上記のスクリプトは失敗せず、期待どおりに機能します。

Begin Try
Declare @SQL NVarchar(Max)='Exec [MyLinkedServer].master.dbo.sp_executesql N''Drop Table [tempdb].dbo.[T1]''';
Print   @SQL;
Exec master.dbo.sp_executesql @SQL;
End Try
Begin Catch
print 'in catch'
Print Error_Message()
End Catch

Exec [MyLinkedServer].master.dbo.sp_executesql N'Drop Table [tempdb].dbo.[T1]'
in catch
Could not find server 'MyLinkedServer' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.

「キャッチ」メッセージが表示されますか?catch ブロックが実行された証拠です。

しかし、コンパイル エラーが発生したスコープでキャッチできないというよく知られた問題があることは確かです。これは絶対に予想されることですが、コードのコンパイルに失敗したときに C# プログラムで catch ブロックを実行するように要求するようなものです...この問題は、 SQL 2005 以降のエラー処理 で詳細に説明されています。内側のスコープで発生するコンパイル エラーをキャッチするには、外側のスコープを作成する必要があります。これは、投稿された例で行うこととまったく同じです!

于 2013-08-22T10:23:14.850 に答える