2015-10-06 60 views
-1

如何在递归过程中处理错误?我正在使用SQL Server 2012.递归过程错误处理

CREATE PROCEDURE [dbo].[TEST] 
    @i INT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET XACT_ABORT ON; 

    BEGIN TRANSACTION [T] 
    BEGIN TRY 

     PRINT @i 

     IF @i = 10 
     BEGIN 
      COMMIT TRANSACTION [T] 
      RETURN; 
     END 
     ELSE 
     BEGIN 
      SET @i = @i + 1; 
      EXEC DBO.TEST @i; 
     END 

     COMMIT TRANSACTION [T] 

    END TRY 
    BEGIN CATCH 
     IF @@TRANCOUNT>0 
      ROLLBACK TRANSACTION [T] 
     SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage; 
    END CATCH 

END 

这只是一个示例,因为我没有自动发布原始代码。

+1

那会是什么错误?你可以发布存储过程,所以我们可以帮助你。 – JBond

+0

我很迷惑提交的位置,以及SQL是否有变量来检查递归级别。 –

+0

这是纯粹的,纯粹的邪恶。在最好的日子里,T-SQL是一种可怕的编程语言;使用它来实现递归和混合,并与事务处理有关。在你发布的例子中,'@ i'将指示递归的级别,应该是有帮助的。如果你没有这样的变量,你可以使用存储在临时表中的行。 T-SQL无法访问类似堆栈跟踪的东西(尽管我很想在这方面证明是错误的)。但是,您可以使用事件探查器跟踪或扩展事件跟踪过程外的调用。 –

回答

0
CREATE PROCEDURE [dbo].[TEST] 
    @i INT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET XACT_ABORT ON; 

    DECLARE @InNestedTransaction BIT; 

    BEGIN TRY 

     IF (@@TRANCOUNT = 0) 
     BEGIN 
      SET @InNestedTransaction = 0; 
      BEGIN TRAN; -- only start a transaction if not already in one 
     END; 
     ELSE 
     BEGIN 
      SET @InNestedTransaction = 1; 
     END; 

     /*********************************************/ 
     PRINT @i 

     IF @i = 8 
     BEGIN 
      DECLARE @ForceError INT; 
      --set @ForceError = 1/0; -- uncomment this line to force error. 
     END 
     IF @i = 10 
     BEGIN 
      RETURN; 
     END 
     ELSE 
     BEGIN 
      SET @i = @i + 1; 
      EXEC DBO.TEST @i; 
     END 
     /*********************************************/ 

     IF (@@TRANCOUNT > 0 AND @InNestedTransaction = 0) 
     BEGIN 
      COMMIT; 
     END; 

    END TRY 
    BEGIN CATCH 
     IF (@@TRANCOUNT > 0 AND @InNestedTransaction = 0) 
     BEGIN 
      ROLLBACK; 
      SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage; 
     END; 
     ELSE 
     BEGIN 
      THROW; 
     END 

    END CATCH 

END