いいえ、上記のスクリプトは失敗せず、期待どおりに機能します。
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 以降のエラー処理 で詳細に説明されています。内側のスコープで発生するコンパイル エラーをキャッチするには、外側のスコープを作成する必要があります。これは、投稿された例で行うこととまったく同じです!