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


13

私は読み取りERROR_STATE()エラーの同じタイプが発生する可能性がソースコードにおける異なる状態/位置を区別するために缶の助けを。しかし、それがどのように役立つかは、私にははっきりしていません。

MSDNの状態:

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

実際にどのように使用できますか?誰かが私に例を示すことができますか?このリファレンス記事で提供されているものは本当に私に物事をうまく説明するのに役立ちませんか?


Error_StateError_Number組み合わせることで、エラーについてより明確な画像が得られます。その他のエラー処理に関連する関数については、こちらをご覧ください
Ravindra Gullapalli 2013

ありがとう!しかし、私は以前にもこのリンクを読んでいた。これについては、MSDNで良い例が示されていないため、役に立ちませんでした。それが私がここで質問をした理由です。

回答:


9

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


はい、これは私が探していたものです。:)今はすべてクリアです!ありがとうございました!
jaczjill 2013年

とてもいい答えです。あなたの投稿から得られる知識は、このtechnet.microsoft.com/en-us/library/ms180031.aspx
kashif

6

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

SELECT 1/0;

結果:

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

State値1のと呼ばれるものを参照してください。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


ありがとう、それは少し助けになりました。私には必要な特権がないため、回答に賛成票を投じることができませんでした。しかし、この関数の存在理由を例を挙げて知りたかった。MSDNはERROR_STATE()がエラー状態番号を返すと言っています。それから私はそれで何をしますか!!

2
@jaczjillは、error_stateとエラー処理アーキテクチャの複雑さに応じて、特定の方法でアプリケーションに応答させたい場合がありますが、そのようにエラーを広く処理することはまれだと思います。エラー番号自体(特定のエラーをトラップする)またはエラーの重大度でより一般的です。エラー状態が存在することを示すデモを除いて、誰かがエラー状態を意味のある方法で使用したことを覚えたことはありません。
アーロンバートランド

よし、ありがとうAaron :)また、この質問に報奨金を設定できますか?そのため、一部の技術者は、その正確な答えを得るために挑戦として取り上げます。そうでなければあなたは勝者です。

4
ええ@AaronBertrandはあなたの正解と競うためにあなた自身のポイントをたくさん上げました。
Zane

2
@jaczjill AaronよりもSQL Serverについてよく知っている技術者はそれほど多くなく、そのほとんどがここには現れません。そしてあなたの質問はここで答えられます(おそらくそれが行くことができるのとまったく同じくらい正確です)。
dezso

1

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


常にERROR_NUMBER()関数で使用されることを概念的に理解しました。ただし、その使用例ERROR_STATE()とERROR_NUMBER()を併用すると、全体像が明確になります。または、適切な参照リンクで十分です。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.