TRY CATCH +错误存储让程序运行

时间:2018-06-13 14:19:20

标签: sql sql-server

我正在创建一个错误跟踪过程,其想法是,如果从proc或数据质量发生错误,将触发标准错误或自定义错误,停止存储过程并存储错误。但是,我当前的脚本完全存储错误,但不会停止proc运行。

以下是代码示例:

DECLARE @ErrorProcedure        VARCHAR(128)  
DECLARE @ErrorMessage          VARCHAR(4000) 
DECLARE @ErrorSeverity         INT  
DECLARE @ErrorCreateDate       DATETIME2                    ---DECLARED VARIABLES THAT ARE BEING PASSED ON TO THE ERROR INSERT FUNCTION
DECLARE @ErrorCode             INT 
DECLARE @ErrorUserName         VARCHAR(128) 
DECLARE @ErrorLine             INT  
DECLARE @ErrorParameter        VARCHAR(750)
DECLARE @ErrorReportName       VARCHAR(128)
DECLARE @ErrorTrackingID       INT
DECLARE @TriggerParameter      INT

SET @ErrorParameter = 'no parameters'

 SET NOCOUNT ON;
 BEGIN TRY
  SELECT 1/0;
   -- THROW 50000,'You tried to divide.', 1;
 END TRY
 BEGIN CATCH


   --SET @ParamDetails = ' @Var1 = ' + CAST(ISNULL(@Var1, 'NULL') AS VARCHAR(256))
   --                 + ',@Var2 = ' + CAST(ISNULL(@Var2, 'NULL') AS VARCHAR(256))
   --                 + ',@Var3 = ' + CAST(ISNULL(@Var3, 'NULL') AS VARCHAR(256))

  --EXEC dbo.ErrorTrackingInsert @ParamDetails,@ErrorTrackingId OUTPUT
  --select @ErrorTrackingId
  --RAISERROR('You tried to divide by 0.', 16, 1);


  SELECT  ---THIS IS WHERE WE STORE THE ERROR VALUES CREATED IN THE TRY ABOVE
       @ErrorProcedure = ERROR_PROCEDURE()  ,  
       @ErrorMessage = ERROR_MESSAGE()      ,
       @ErrorCode = ERROR_NUMBER()          ,                                                                   --- This Section allows us to store the error inputs into the variable
       @ErrorSeverity= ERROR_SEVERITY()     ,   
       @ErrorCreateDate  = SYSDATETIME()    , 
       @ErrorUserName = SUSER_SNAME()       , 
       @ErrorLine= ERROR_LINE()   

       EXEC [dbo].[TestErrorInsert] @ErrorProcedure , 
                 @ErrorMessage   ,
                 @ErrorSeverity  ,
                 @ErrorCreateDate,
                 @ErrorCode      ,
                 @ErrorUserName  ,
                 @ErrorLine      ,
                 @ErrorParameter ,
                 @ErrorReportName,
                 @ErrorTrackingID OUTPUT


 END CATCH
END  

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

发现类似问题的任何人都可以。

如果您在END CATCH此代码串之前添加:

PRINT @ErrorMessage;
THROW;
RETURN

答案 1 :(得分:0)

听起来XACT_ABORT已关闭。如果您SET XACT_ABORT ON,则当前批次将被终止,任何未结交易将被终止。

  

当SET XACT_ABORT为ON时,如果Transact-SQL语句引发了   运行时错误,整个事务终止并回滚。

     

当SET XACT_ABORT为OFF时,在某些情况下只有Transact-SQL   引发错误的语句将回滚并进行事务处理   继续处理。根据错误的严重程度,   即使SET XACT_ABORT为OFF,整个事务也可以回滚。   OFF是默认设置。

上面链接文章的顶部提到在新应用中使用THROW而不是RAISERROR:

  

THROW声明表彰SET XACT_ABORT。 RAISERROR没有。新   应用程序应使用THROW而不是RAISERROR。