Как бросить внутрь хранимой процедуры, которая использует точку сохранения? - PullRequest
1 голос
/ 24 марта 2019

Я пытаюсь выкинуть ошибку из хранимой процедуры, которая использует точку сохранения, чтобы вернуться к ней, если она вложена, но никогда не выбрасывается.

Я немного обыскал и нашел только решения(не пробовал их), которые используют RAISERROR, однако в документации Microsoft говорится, что RAISERROR больше не следует использовать, вместо этого следует использовать THROW.

Вот небольшой пример.

CREATE OR ALTER PROC sp_should_throw_error
AS
BEGIN
    SET NOCOUNT ON
    SET XACT_ABORT OFF

    DECLARE @TranCounter INT;  
    SET @TranCounter = @@TRANCOUNT;  
    IF @TranCounter > 0
        SAVE TRANSACTION ProcedureSave;  
    ELSE  
        BEGIN TRANSACTION;  

    BEGIN TRY  
        THROW 50001, 'Spitted out an error.', 1

        IF @TranCounter = 0
            COMMIT TRANSACTION;  
    END TRY

    BEGIN CATCH  
        IF @TranCounter = 0 ROLLBACK TRANSACTION;  
        ELSE IF XACT_STATE() <> -1 ROLLBACK TRANSACTION ProcedureSave;  
    END CATCH  
END

EXEC sp_should_throw_error

Я надеюсь, что кто-нибудь может указать мне, что я делаю здесь неправильно.Почему ошибка никогда не выдается?

1 Ответ

2 голосов
/ 24 марта 2019

Вам понадобится THROW в последнем блоке CATCH, чтобы повторно вызвать ошибку. В противном случае он не будет передан клиенту, потому что вы поймали и обработали его.

CREATE OR ALTER PROC usp_should_throw_error
AS
BEGIN
    SET NOCOUNT ON
    SET XACT_ABORT OFF

    DECLARE @TranCounter INT;  
    SET @TranCounter = @@TRANCOUNT;  
    IF @TranCounter > 0
        SAVE TRANSACTION ProcedureSave;  
    ELSE  
        BEGIN TRANSACTION;  

    BEGIN TRY  
        THROW 50001, 'Spitted out an error.', 1

        IF @TranCounter = 0
            COMMIT TRANSACTION;  
    END TRY

    BEGIN CATCH  
        IF @TranCounter = 0 ROLLBACK TRANSACTION;  
        ELSE IF XACT_STATE() <> -1 ROLLBACK TRANSACTION ProcedureSave;  
        THROW;
    END CATCH  
END;
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...