web-dev-qa-db-ja.com

SQL ServerのERROR_STATE()とは何ですか?

ERROR_STATE() は、同じタイプのエラーが発生する可能性のあるソースコードのさまざまな状態/場所を区別するのに役立ちます。しかし、それがどのように役立つかは、私にははっきりしていません。

MSDNの状態:

ERROR_STATE() TRY…CATCH構成のCATCHブロックが実行される原因となったエラーの状態番号を返します。

実際にどのように使用できますか? このリファレンス記事 で提供されている例を私に教えてもらえますか?

13
jaczjill

SQL Serverのエラー状態の目的は、SQL Server開発チームが、複数の場所で多くのエラーが発生した場合に、システムエラーが発生した正確な場所をコードで識別できるようにすることです。

エンドユーザー(つまり、SQL Serverを使用するアプリケーションの開発者)は、RAISERRORに渡された状態を同様に使用して、プロシージャがエラーを発生させた場所を製品サポートが識別できるようにします。次に例を示します。

create procedure usp_my_proc
as
if <somecondition>
  raiserror(N'Error foo and bar', 16, 0);
if <someothercondition>
  raiserror(N'Error foo and bar', 16, 1);
go

2つの状態がどのエラーケースにヒットしたかを後で区別できるようにする方法を参照してください。あなたが「エラーメッセージを見ることができます」と言う前に、私はあなたに一つの言葉を言っています:国際化。

9
Remus Rusanu

いいえ、エラーが発生した場所を見つけるのに役立ちません。これは簡単な例です。 0で除算しようとすると、多数の詳細を含むエラーメッセージが表示されます。

_SELECT 1/0;
_

結果:

_Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
_

値が1のStateを参照してください。 ERROR_STATE()はこの値を返します。したがって、_TRY/CATCH_を使用する場合:

_BEGIN TRY
  SELECT 1/0;
END TRY
BEGIN CATCH
  SELECT ERROR_STATE();
END CATCH
_

結果:

_----
   1
_

それで全部です。ほとんどのシナリオでは役に立ちません。役に立つと思われる特定の関数について深く掘り下げる前に、一般的にエラー処理についてさらに読むことをお勧めします。

http://msdn.Microsoft.com/en-us/library/ms175976.aspx

http://www.sommarskog.se/error_handling_2005.html

6
Aaron Bertrand

短い答え-それはできません。 ERROR_STATEは、本質的にERROR_NUMBERの下位区分です。エラーの原因となったコード行を特定することはできません(ERROR_NUMBERとERROR_STATEが一緒になってエラーの原因を特定し、原因が明らかになる場合を除きます)。

1
RB.