希望确保在我的存储过程中正确捕获了错误

时间:2019-06-21 19:48:27

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

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

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错误捕获方法能够成功捕获错误(如果出现)?有什么想法吗?

1 个答案:

答案 0 :(得分:4)

您应该签出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错误日志,因此您根本不会“捕获”该错误。