2017-03-23 12 views
0

私は、これはその、本当にトランザクションがコミットされる前に起こっ誤りがあることを言っていることであるグーグルの後に見つけた何私のSPが私に有用なエラーメッセージを表示しないのはなぜですか?

"db_ErrorCode Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0." 

私は非常に一般的なエラーを返すSQL Serverのストアドプロシージャを持っています。

BEGIN TRY    

BEGIN TRANSACTION  
SPの開始時に

、および

COMMIT TRANSACTION    

     END TRY    

    BEGIN CATCH    

    ROLLBACK TRANSACTION    

    SELECT @ErrorNumber = ERROR_NUMBER(),    
    @ErrorLine = ERROR_LINE(),    
    @ErrorMessage = ERROR_MESSAGE()    

    RAISERROR (@Flag, 18, 120);    

     END CATCH    

END   

問題があるがありますが、これらの行の間のコードの約1100行をだし、ということである問題がある場合は、 SP全体をロールバックする必要があるため、try/catch文を間に置くことはできません。そして、なぜ私の最終的なCatchブロックが実際のエラーを返さないのですか?

+1

「set XACT_ABORT ON」をspの先頭に追加してみてください。これはTransaction Countエラーを取り除き、実際のエラーを表示する必要があります。 –

+0

BEGIN TRYとBEGIN TRANSACTIONの前に、グローバルと一緒に? –

+0

はい、グローバルを使用しています。 –

答えて

1

Sql Serverが1100行のコード全体を見ることなく、特にエラーメッセージを表示する理由について私は答えられません。しかし、エラーを突き止めるために何をすべきかを知りたければ、私はあなたにいくつかのヒントを与えることができます。 最初に大きなストアドプロシージャでは、私は常に入力変数として@Debug変数を持っています。最後の変数にして、デバッグモードではないデフォルトの値0を与えます。デフォルト値がある場合は、最後の変数として追加することで、コードの既存の呼び出しを中断してはいけません。

デバッグするときに、完了したステップやさまざまな操作の結果を示すテストまたは結果を追加できます。あなたはPROC内のすべての重要なステップの後に、このコードを追加したり、多分後でPROCで、その中に複数のステップを持つ一方または両方を有することができる

IF @DEBUG=1 
BEGIN 
<add your tests here> 
END 

のようなif文にこれらのステップを包みます。私は、procを通るステップで何が起きるのか、そして最後に結果がどうあるべきかを示すものを見るためのチェックをする傾向があります。

このコードは、デバッグモードのときにのみ実行されます。あなたが置くかもしれないものは、procのその時点で変数を選択して印刷するか、現在のステップの名前を表示するか、通常は挿入の基礎となる選択を実行するか、または

もう1つのことは、ステップが完了したときにステップを格納するテーブル変数を作成することです。テーブル変数はロールバック後にスコープ内にとどまるため、選択を行い、ロールバック前に完了したステップを確認することができます。

関連する問題