Можно ли изменить ALTER TABLE (DDL) в середине транзакции DML в той же таблице?

Скажем, вы начинаете SqlTransaction из C#, внутри которого вы вставляете данные из DataTable в таблицу SQL, но эти данные представляют собой МНОГО данных, поэтому вы делаете это "порциями" с помощью SqlBulkCopy внутри транзакции SQL и фиксируете только транзакция, если все фрагменты скопированы успешно.

Теперь предположим, что вы знаете, что иногда длина вставляемых значений будет превышать максимальный размер столбца в целевой таблице, поэтому SqlBulkCopy в этот момент завершится с ошибкой для этого конкретного "чанка". Возможно ли (или даже желательно) перехватить это исключение и изменить таблицу / столбец, чтобы увеличить максимальную длину целевого столбца, а затем продолжить данные SqlBulkCopy, собирая следующий "чанк", который нужно скопировать, даже если вы этого не сделали совершил "вставку", с которой вы начали?

Итак, пытаясь перефразировать это, можно ли запустить транзакцию DML, остановиться в середине этой незафиксированной транзакции, выполнить DDL для изменения целевой таблицы, затем завершить исходный DML и зафиксировать его?

1 ответ

Чтобы ответить на ваш вопрос, можно изменить таблицу между операторами вставки. Если вы поместите транзакцию в каждую партию, вам потребуется откатить только 1 партию, чтобы обновить длину столбца. При таком подходе есть больше накладных расходов, чем установка длины столбца перед началом вставки данных.

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

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