2015-10-06 57 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