私たちは、主にSQL Server 7.0で書かれた大規模なアプリケーションを持っています。ここでは、すべてのデータベース呼び出しがストアドプロシージャです。 T-SQLの機能が多く提供されているSQL Server 2005が実行されています。SQL ServerのT-SQLエラー処理のベストプラクティスは何ですか?
ほとんどすべてのSELECT、INSERT、UPDATE、およびDELETEの後、@@ ROWCOUNTと@@ ERRORはローカル変数に取り込まれ、問題を評価されます。問題がある場合は、次の行われます。
- エラーメッセージ出力パラメータが設定されている
- ロールバック(必要な場合)
- 情報を行われているがとテーブル
- リターンをログに記録する(INSERT)に書かれています
これらはすべて行をチェックしません(既知の場合のみ)。多少のログ/デバッグ情報ではいくつかの違いがあります。また、行ロジックはエラーロジックから時々分割されます(WHERE句で並行性フィールドがチェックされる更新ではrows = 0は他の誰かがデータを更新したことを意味します)。しかし、ここにはかなり一般的な例があります:
SELECT, INSERT, UPDATE, or DELETE
SELECT @[email protected]@ERROR, @[email protected]@ROWCOUNT
IF @Rows!=1 OR @Error!=0
BEGIN
SET @ErrorMsg='ERROR 20, ' + ISNULL(OBJECT_NAME(@@PROCID), 'unknown')
+ ' - unable to ???????? the ????.'
IF @@TRANCOUNT >0
BEGIN
ROLLBACK
END
SET @LogInfo=ISNULL(@LogInfo,'')+'; '+ISNULL(@ErrorMsg,'')+
+ ' @YYYYY=' +dbo.FormatString(@YYYYY)
+', @XXXXX=' +dbo.FormatString(@XXXXX)
+', Error=' +dbo.FormatString(@Error)
+', Rows=' +dbo.FormatString(@Rows)
INSERT INTO MyLogTable (...,Message) VALUES (....,@LogInfo)
RETURN 20
END
私はこれをTRY-CATCH T-SQLで置き換える方法を検討しています。私はTRY...CATCH (Transact-SQL)の構文について読んだので、その概要を掲載しないでください。私は良いアイデアを探していますどのように最高私たちのエラー処理方法を行うか、改善する。 Try-Catchでなくても、T-SQLエラー処理の優れたやり方だけを使用することができます。
私はそれがSQL Server 2005のものをスキップすると感じますが、とにかく優れています。そして彼のサイトの残りの部分も。 – gbn
SQL Server 2005以降については、http://www.sommarskog.se/error_handling/Part1.html –