Как получить фактическую ошибку в случае непринятой транзакции на сервере SQL? - PullRequest
0 голосов
/ 18 июня 2019

Я вызываю sp от другого sp, который вызывает другого sp изнутри. Например, sp1-> sp2-> sp3 Я использовал TRY-CATCH во всех из них. Я явно поднимаю ошибку в sp3, а затем перехватываю try-catch, затем снова поднимаю ее, ловлю в sp2, затем снова поднимаю, а затем ловлю в sp3. Это отлично работает.

Однако, когда я добавляю BEGIN TRAN для самого внешнего sp, который является sp1. Я получаю Текущая транзакция не может быть зафиксирована и не может поддерживать операции записи в файл журнала. Откат транзакции. ошибка.

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

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

Например НАЧАТЬ НАЧАЛО ТРАН

    EXEC sp2

    COMMIT TRAN
    END TRY
    BEGIN CATCH
        SELECT ERROR_MESSAGE()
        SELECT @@TRANCOUNT > 0
        ROLLBACK
    END CATCH

Например, Я добавил эту строку в sp3 RAISERROR ('Перехват ошибок из sp3 для тестирования ...', 11, 2)

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

Однако, если я удаляю BEGIN TRAN из самого внешнего sp3, я получаю фактическую ошибку и работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...