Sql 当旧的、新的错误陷阱彼此相邻时,过程停止

Sql 当旧的、新的错误陷阱彼此相邻时,过程停止,sql,error-handling,try-catch,Sql,Error Handling,Try Catch,我们有一堆旧的存储过程,带有遗留样式的错误捕获。前几天我换了一个,包括了一个新的TRY…CATCH块。该存储过程在TRY/CATCH之后停止,并返回,就好像旧块中有错误一样 如果我放一个 SELECT NULL 在两者之间,一切正常。有人知道为什么会这样吗 --BEGIN NEW ERROR TRAP-- BEGIN TRY Do stuff... END TRY BEGIN CATCH END CATCH --END NEW ERROR TRAP--- ----------------- O

我们有一堆旧的存储过程,带有遗留样式的错误捕获。前几天我换了一个,包括了一个新的TRY…CATCH块。该存储过程在TRY/CATCH之后停止,并返回,就好像旧块中有错误一样

如果我放一个

SELECT NULL
在两者之间,一切正常。有人知道为什么会这样吗

--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 ------------------
--开始新的错误陷阱--
开始尝试
做些事情。。。
结束尝试
开始捕捉
端接
--结束新的错误陷阱---
-----------------旧式陷阱开始-----------------
选择@spERROR=@@ERROR,
@spROWCOUNT=@@ROWCOUNT
设置@spRETURN=@spRETURN+1

如果在try-catch块中(@spROWCOUNT),则最后一条语句可能正在执行将行计数设置为0的操作。“SELECT NULL”将行计数设置为1,因为它返回一行,因此未检测到任何错误


您可以通过更改“旧”中的逻辑来解决此问题代码或通过在try/catch代码中设置行计数变量。我建议您删除SELECT NULL,因为它可以保证成功,并且您可能不希望出现这种行为。

您如何知道它停止工作?您的返回值并不总是正确的?如果我将SELECT NULL放在try部分的末尾怎么办?这将有助于重置行计数。您需要保留旧代码吗?更改所有内容以尝试/捕获块会更干净。