Как предотвратить откат транзакции при обнаружении ошибки в try catch в SQL Server 2005
У меня есть таблица Table1 с записями
Table1
-------------------------------
ID F1
-------------------------------
01 1
02 OK
03 52
04 53
05 Null
------------------------------
здесь я хочу изменить тип данных F1 Varchar на десятичный (3,0); Затем я создаю новую таблицу с новой структурой.
Я хочу вставить каждое повторение старой таблицы в новую, явно преобразовав varchar в десятичную. поэтому я пишу эту команду в блоке try catch. где если генерируется ошибка, то в блоке catch я могу заполнить его значением по умолчанию. но вся эта работа выполняется между началом транзакции и фиксацией транзакции. Поэтому, когда в блоке catch обнаружена ошибка, дальнейшая работа невозможна, возникает ошибка
Текущая транзакция не может быть зафиксирована и не может поддерживать операции записи в файл журнала. Откат транзакции.
Как предотвратить откат этой транзакции, даже если в блоке try catch произошла ошибка.
2 ответа
Ты не можешь. Вы должны всегда проверять XACT_STATE и действовать соответственно:
Uncommittable транзакции и XACT_STATE
Если ошибка, сгенерированная в блоке TRY, приводит к тому, что состояние текущей транзакции становится недействительным, транзакция классифицируется как незафиксированная транзакция. Ошибка, которая обычно завершает транзакцию вне блока TRY, приводит к тому, что транзакция переходит в состояние uncommittable, когда ошибка происходит внутри блока TRY. Нефиксированная транзакция может выполнять только операции чтения или ROLLBACK TRANSACTION. Транзакция не может выполнить какие-либо операторы Transact-SQL, которые бы генерировали операцию записи или COMMIT TRANSACTION. Функция XACT_STATE возвращает значение -1, если транзакция была классифицирована как незафиксированная транзакция. Когда пакет завершается, компонент Database Engine откатывает любые активные незафиксированные транзакции. Если сообщение об ошибке не было отправлено, когда транзакция перешла в состояние uncommittable, когда пакет завершается, клиентское приложение отправит сообщение об ошибке. Это указывает на то, что незафиксированная транзакция была обнаружена и откатана.
К сожалению, это невозможно с SQL SERVER.
Любая ошибка обрекает транзакцию, и обреченная транзакция не может быть ни зафиксирована, ни развернута до точки сохранения.
Единственное решение: использовать ДРУГОЙ БАЗА ДВИГАТЕЛЕЙ...