Как предотвратить откат транзакции при обнаружении ошибки в 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.

Любая ошибка обрекает транзакцию, и обреченная транзакция не может быть ни зафиксирована, ни развернута до точки сохранения.

Единственное решение: использовать ДРУГОЙ БАЗА ДВИГАТЕЛЕЙ...

Другие вопросы по тегам