Нужно быть уверенным, что ошибки правильно фиксируются в моей хранимой процедуре - PullRequest
1 голос
/ 21 июня 2019

Я проверяю, могу ли я правильно зафиксировать свои ошибки в этой хранимой процедуре:

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 Ответ

4 голосов
/ 21 июня 2019

Вы должны проверить Руководство Erland по обработке ошибок

В этом инклюзивном руководстве предлагается изменить как минимум 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, так что вы вообще не «поймаете» ее.

...