1

Entityデータベースに存在しないテーブルからエントリを選択するストアド プロシージャがあります。

以下のコードでは、ストアド プロシージャを実行すると、catch ブロックに移動しませんが、try ブロックのすべてのエラーは自動的に catch ブロックに移動する必要があります。

理由が理解できません

Create PROCEDURE AddUpdateEntity
   (@Name VARCHAR(20),
    @Age SMALLINT)
AS
  BEGIN TRY
     SELECT NAME, Age FROM Entity WHERE NAME = @name AND Age = @Age
  END TRY
  BEGIN CATCH
     SELECT ERROR_NUMBER() StatusCode, ERROR_MESSAGE() [Message]
  END CATCH
GO

/* Command to execute the SP */
EXEC AddUpdateEntity 'Sandeep',20

この実行ステートメントは、「無効なエンティティ オブジェクト」というエラーを表示していますが、catch ブロックを呼び出していません。

ストアド プロシージャがクラッシュし、メッセージが表示されている

メッセージ 208、レベル 16、状態 1、手順 AddUpdateEntity、行 10
Nom d'objet 'Entity' は有効ではありません。

4

2 に答える 2

9

MSDN に従って (リンクhttp://msdn.microsoft.com/en-us/library/ms175976.aspxに従ってください)

TRY…CATCH コンストラクトの影響を受けないエラー

TRY…CATCH コンストラクトは、次の条件をトラップしません。

  • 重大度が 10 以下の警告または情報メッセージ。

  • セッションの SQL Server データベース エンジン タスクの処理を停止する、重大度が 20 以上のエラー。重大度 20 以上のエラーが発生し、データベース接続が中断されていない場合、TRY...CATCH がエラーを処理します。

  • クライアント割り込み要求やクライアント接続の切断などの注意。

  • システム管理者が KILL ステートメントを使用してセッションを終了した場合。

次のタイプのエラーは、TRY…CATCH コンストラクトと同じ実行レベルで発生した場合、CATCH ブロックによって処理されません。

  • 構文エラーなど、バッチの実行を妨げるコンパイル エラー。

  • 名前解決の遅延が原因でコンパイル後に発生するオブジェクト名解決エラーなど、ステートメント レベルの再コンパイル中に発生するエラー。

これらのエラーは、バッチ、ストアド プロシージャ、またはトリガーを実行したレベルに返されます。

TRY ブロック内の下位の実行レベルでコンパイルまたはステートメント レベルの再コンパイル中にエラーが発生した場合 (たとえば、sp_executesql またはユーザー定義のストアド プロシージャを実行している場合)、エラーは TRY…CATCH コンストラクトよりも下位のレベルで発生し、関連する CATCH ブロックによって処理されます。

上記の説明で問題が解決することを願っています。

于 2013-04-05T05:08:34.290 に答える