我正在创建一个错误跟踪过程,其想法是,如果从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
非常感谢任何帮助。
答案 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。