Я вызываю 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, я получаю фактическую ошибку и работает нормально.