【保存版】2013年度発売全パチスロアプリ一覧(iPhone,iPad)

【SQLServer】エラー処理でのTRY...CATCHはコンパイルエラーをキャッチできない。

SQLServerのT-SQL(Transact-SQL)のエラー処理はというと、
TRY...CATCHステートメントを使うのが一般的かと思います。
TRY部でエラーが発生すると、例外をとらえてCATCH部に処理が
移ります。エラーはCATCH部でスマートに処理できます。

VBAでいう、ON ERROR GOTO ...と同じような処理方法です。

まあ、当たり前といえば当たり前のように感じますが、
実はTRY...CATCHステートメントは、
SQLServer2005以降から実装されたステートメントです。

それ以前のバージョン(SQLServer2000以前)では、
エラー発生を自分でチェックし、
(@@ERRORを参照し、ゼロでない場合は何らかの
エラーが発生しているのでエラー処理をする)
処理しなければならないというめんどくさい記述が必要でした。

今年、MicrosoftはSQLServer2000のサポートを終了しました。
SQLServerでのシステム開発者の皆様は一安心かと思います。

さて、このTRY...CATCHステートメントですが、ほとんどのエラーは
捕捉しますが、全てのエラーを捕捉できるわけではありません。

次の2種類のエラーはCATCHできません。

1 コンパイル エラー
2 再コンパイルで発生するエラー(コンパイル後の名前の遅延解決により
発生するオブジェクト名の解決エラーなど)

TRY...CATCHは、ストアドプロシージャーで使うことが多いと思います。
1のコンパイル エラーがあるとストアドプロシージャーを作成できないので
問題ないかと思いますが、2の再コンパイルで発生するエラーは
どうでしょうか?

これは、たとえば参照テーブル名が、ストアドプロシージャー作成時と
変わっているような場合に発生します。

create prodedure なんたらプロシージャー
as
begin try
 select * from なんたらテーブル
end try
begin catch
 エラー処理
end catch

上記例で、実行時に「なんたらテーブル」が存在しない場合、
TRY部でバッチが落ち、CATCHのエラー処理は実行されません。

このような場合にもエラー処理する方法の説明は以下。
Transact-SQL での TRY...CATCH の使用
コンパイル時またはステートメントレベルの再コンパイル時に発生するエラーを TRY...CATCH を使用して処理するには、エラーが発生するコードを TRY ブロック内部の独立したバッチで実行します。これを行うには、たとえば、コードをストアド プロシージャに記述するか、sp_executesql を使用して動的な Transact-SQL ステートメントを実行します。これにより、エラーの発生場所よりも高い実行レベルのエラーを TRY...CATCH でキャッチできます。

「再コンパイルで発生するエラー」が発生しそうな部分を
別バッチにすればよいようです。

なので、先ほどの例を動的SQLに変更したものが以下。

create prodedure なんたらプロシージャー
as
begin try
 declare @sql varchar(4000)
 set @sql ='select * from なんたらテーブル'
 exec (@sql)
end try
begin catch
 エラー処理
end catch

この記述方法ですと、「なんたらテーブル」が存在しない場合でもcatch部で
エラー処理が実行されます。
また、再コンパイルエラーが発生しそうな部分を別プロシージャーとし、
呼び出し元プロシージャーでTRY...CATCHしてもいいようです。

関連ブログ
T-SQL の TRY-CATCH
【SQL Server 2005 - ストアド】便利な TRY - CATCH

T-SQL使いの方はぜひ。サンプル豊富です。
あまりT-SQLの関連書籍は発売されていないのでお勧め。
値段は6000円とお高いですがその価値があるかと。
(注意:初心者向けではないかと思います。)
>>SQL Server 2005 ストアドプロシージャプログラミング (SQL Server Books)


SQLServerとは関係ないですが、ExcelVBAからWEB上のデータを
参照する方法です。今何気に人気ですね。
>>Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

[Google PR]

Twitterはじめました。プラプラ | Twitter

<< 【デジモノ】なぜライトニングケーブルは高いのか?HanyeTech製は169円と激安!
【SQLServer】知ってた?トランザクションログバックアップが、ログ削除の方法です。 >>

[関連エントリ 最新5]

[Google PR]


[最新エントリ 5]

>>トップページ
人気カテゴリ:AccessTips SQLServer CakePHP iPad
過去ログ(全記事一覧)

コメント
コメントする(お気軽にどうぞ)









この記事のトラックバックURL
トラックバック
カテゴリー
プロフィール
お問い合わせ
Powered by NINJA TOOLS
links
recent comment
  • 【Access】vbaでhmacが正しく計算できた!!
    まさ (06/01)
  • 【Access】AccessReportMailメール送信時のポートを25から587へ
    わら (05/31)
  • 【SQLServer】超シンプル!再帰CTE(共通テーブル式)で連続データを作成する。
    sazi (09/08)
  • 【あまっちゃお】Amazon商品検索「あまっちゃお」プロジェクト始動。Ver00-06-00 β
    カメちゃん (07/31)
  • 【Access】あれ?DoCmd.RunCommand acCmdSaveRecordの内部仕様が変わった?
    花姉 (03/17)
  • 【Access】実行中のmdb(自分自身)をバックアップコピーする方法。
    亀 (02/06)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    管理人 (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    あ (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    K (11/13)
  • 【VAIOP】VaioXと両持ちできるものすっっごくマニアックなケース。当たり前ですが在庫限り。(笑)
    管理人 (08/04)
recent trackback
  • 【Access】2003安全でない式がブロックされていませんとセキュリティーレベル。
    awgs Foundry (10/29)
  • 【VAIOtypeP】液晶保護シートは、新車のカバーではない。レイアウト社液晶/天板保護フィルムセットRT-VP1FS1
    XMLがキライ。 (04/09)
  • Vistaから、LinkStation(NAS)にアクセスできません。
    そのほかいろいろ (09/06)