【问题标题】:Looking to be sure that errors get caught properly in my stored procedure确保在我的存储过程中正确捕获错误
【发布时间】:2019-06-21 19:48:27
【问题描述】:

我正在查看是否能够在此存储过程中正确捕获我的错误:

ALTER PROCEDURE [dbo].[sp_UpdateText] 
    (@aID AS INT, 
     @CompanyID AS INT,
     @CompanyName AS VARCHAR(MAX))
AS
BEGIN
    DECLARE @Result VARCHAR(MAX)

    BEGIN TRY
        SET @Result = (SELECT dbo.[udf_StripHTMLTags](@CompanyName))  -- UDF function that strips HTML tags off my text field

        BEGIN TRANSACTION
            UPDATE __TestTable1
            SET CompanyName = @Result
            WHERE aid = @aid AND CompanyID = @CompanyID

            COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        DECLARE @ErrorNumber INT = ERROR_NUMBER();
        DECLARE @ErrorLine INT = ERROR_LINE();

        PRINT 'ERROR NUMBER: ' + CAST(@ErrorNumber as Varchar(10));
        PRINT 'ERROR LINE: ' + CAST (@ErrorLine as Varchar(10));
    END CATCH
END
Go

我基本上希望这些 BEGIN TRY BEGIN CATCH 错误捕获方法能够成功捕获错误,如果出现?有什么想法吗?

【问题讨论】:

标签: sql-server error-handling ssms-2012


【解决方案1】:

你应该看看Erland's Guide to Error Handling

此包容性指南的建议是将您的 CATCH 至少更改为

   BEGIN CATCH
        IF @@trancount > 0 ROLLBACK TRANSACTION   --roll back the tran
        DECLARE @msg nvarchar(2048) = error_message()  --error message is usually more helpful
        DECLARE @ErrorNumber INT = ERROR_NUMBER();
        DECLARE @ErrorLine INT = ERROR_LINE();
        RAISERROR(@msg,16,1) --RAISE the error 
        RETURN 55555 --return a non-zero to application as non-success
    END CATCH

其中还有很多内容,这就是值得一读的原因。

我差点忘了,SET XACT_ABORT, NOCOUNT ON 在你的进程顶部。

当您激活 XACT_ABORT ON 时,几乎所有错误都具有相同的 效果:任何打开的事务都回滚并中止执行。 有几个例外,其中最突出的是 RAISERROR 语句。

请注意,“打印”错误不会将其存储或记录在任何地方,就像 SQL Server 错误日志一样,因此您根本不会“捕获”它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2010-09-21
    • 2014-11-27
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多