Удивительно, но я не смог найти подходящего объяснения или документации по этой проблеме, с которой я столкнулся.
В случае этих операторов SQL:
SELECT 1 AS Test INTO #tmpTest
BEGIN TRAN
SELECT 1 AS Test INTO #tmpTest
ROLLBACK TRAN
При выполнении одного за другим SELECT ... INTO
в строке 3 завершается неудачно, как и ожидалось, с сообщением -
В базе данных уже есть объект с именем #tmpTest.
Однако после этого оператор ROLLBACK
в строке 4 завершается ошибкой:
У запроса ROLLBACK TRANSACTION нет соответствующего BEGIN
СДЕЛКИ.
Несмотря на то, что транзакция успешно BEGIN
была успешно выполнена в строке 2.
Я видел SQL Server - транзакции откатываются при ошибке? , но ответы здесь не применяются, потому что по умолчанию xact_abort
равно off
. Кроме того, ответ от Quassnoi противоречит ответу от Raj More .
Какое фактическое объяснение?