@ledsun blog

無味の味は佳境に入らざればすなわち知れず

T-SQLのエラー処理方針

T-SQLのエラー処理方針をまとめてみました。

1.更新の無いストアドはエラー処理をしない。

SELECTするだけのストアドは、エラー処理をせずにそのまま例外を上に投げると呼び出し側でTRY-CATCHしやすいです。

2.SQLServerエージェントから呼び出すストアドはusp_RethrowErrorを使う。

この場合はエラーの詳細ををジョブの履歴に残したい。usp_RethrowErrorを使って投げ直す例外のErrorMessageに、キャッチした例外の内容を展開するとジョブ履歴に出だせます。usp_RethrowErroはTRY−CATCH(SQLServer2005以降)のCATCHブロック内で使ってください。usp_RethrowErrorの詳細は↓を参照
http://blogs.wankuma.com/trapemiya/archive/2008/03/13/127556.aspx

3.更新のあるストアドのロールバック

単に前処理をロールバックしたいだけならSET XACT_ABORT ONを使うのが便利です。しかし、XACT_ABORTエラーを中断しないしロールバックもしないためTRY-CATCHとは共存しません。この場合は素直にCATCHブロックにROLLBACK TRANSACTIONを書くのがよいです。

まとめ

上記URL通りに下をテンプレにすればOK。
(※BEGIN TRANSACTIONはTRYの外だよね?)

BEGIN TRANSACTION 
BEGIN TRY 
  --なんとかかんとか 
  COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
 ROLLBACK TRANSACTION 
 EXEC usp_RethrowError; 
END CATCH 

バッチ処理なんかでエラーの出たステップに応じてエラー処理を変えたい場合などは考慮していません。