質問: try catchでシステムエラーを検知できない try catchをネストさせた状態で、 テーブルがドロップされていることを検知するにはどうすればよいでしょうか? begin try ★ begin try ▲ end try begin catch end catch catch end catch としているときに、 ★の位置だとテーブルのドロップはcatch できるのですが ▲の位置だとテーブルのドロップはcatch できないようですが、 テーブルがドロップされていることを検知するにはどうすればよいでしょうか?
回答: 関係ないかもしれませんが、 begin try ★ begin try ▲ end try begin catch end catch catch ↑ここにbeginが必要では? end catch というのは置いておいて、 本当に、 ★の位置だとテーブルのドロップはcatch できるのですが ▲の位置だとテーブルのドロップはcatch できないようですが、 となっているのでしょうか? begin try ★ begin try ▲ end try begin catch ※1 end catch begin catch ※2 end catch となっていたら、▲でテーブルがdropされていてエラーになったら、※2が実行されていると 思われるのですが。 ★と▲両方に別のテーブルを使ったselect文を入れてみてそれぞれのテーブルがdropされた状態で 試してみられては、と思います。 理由 ▲で使用しているテーブルがないときに、 begin try ▲ end try begin catch ※1 end catch がコンパイルエラーになるので、※2のほうのcatchが処理される。 と思いますが。 参考; http://msdn.microsoft.com/ja-jp/library/ms175976.aspx の ---引用--- try ブロック内の下位の実行レベル (たとえば、sp_executesql またはユーザー定義のストアド プロシージャを実行しているとき) でのコンパイル中またはステートメントレベルの再コンパイル中にエラーが発生した場合、そのエラーは try...catch 構造よりも下位のレベルで発生し、関連する catch ブロックによって処理されます。 次の例は、select ステートメントによって生成されたオブジェクト名解決エラーが try...catch 構造でキャッチされず、同じ select ステートメントをストアド プロシージャ内で実行した場合には catch ブロックでキャッチされることを示しています。 (以下例文が載っていますが省略) ---引用ここまで--- ・・・マニュアルベースで実際には試していないですが。