0

レガシー スタイルのエラー トラップを備えた古いストアド プロシージャが多数あります。先日 1 つを変更し、新しい TRY...CATCH ブロックを含めました。ストアド プロシージャは、TRY/CATCH の後に停止し、従来のブロックにエラーがあったかのように返されました。

私が入れたら

SELECT NULL

2 つの間ですべて正常に動作します。なぜこれが起こっているのか知っている人はいますか?

--BEGIN NEW ERROR TRAP--
BEGIN TRY
Do stuff...
END TRY
BEGIN CATCH
END CATCH
--END NEW ERROR TRAP---
----------------- OLD SCHOOL TRAP BEGIN -----------------
SELECT  @spERROR = @@ERROR ,
        @spROWCOUNT = @@ROWCOUNT
SET @spRETURN = @spRETURN + 1
IF ( @spROWCOUNT <= 0
     OR @spERROR <> 0
   ) 
    SET @spRETURN = 0 - @spRETURN
IF ( @spROWCOUNT <= 0
     OR @spERROR <> 0
   ) 
    RETURN @spRETURN
SELECT  @spROWCOUNT = -1 ,
        @spERROR = -1
------------------ OLD SCHOOL ERROR TRAP END ------------------
4

1 に答える 1

2

try catch ブロックでは、最後のステートメントが行数を 0 に設定する何かを実行している可能性があります。「SELECT NULL」は 1 行を返すため、行数を 1 に設定しているため、エラーは検出されません。

「古い」コードのロジックを変更するか、try/catch コードで行カウント変数を設定することで、これを修正できます。SELECT NULL を削除することをお勧めします。削除すると成功が保証され、その動作が望ましくない場合があるためです。

于 2012-06-04T14:03:04.613 に答える