Можно ли изменить ALTER TABLE (DDL) в середине транзакции DML в той же таблице?
Скажем, вы начинаете SqlTransaction из C#, внутри которого вы вставляете данные из DataTable в таблицу SQL, но эти данные представляют собой МНОГО данных, поэтому вы делаете это "порциями" с помощью SqlBulkCopy внутри транзакции SQL и фиксируете только транзакция, если все фрагменты скопированы успешно.
Теперь предположим, что вы знаете, что иногда длина вставляемых значений будет превышать максимальный размер столбца в целевой таблице, поэтому SqlBulkCopy в этот момент завершится с ошибкой для этого конкретного "чанка". Возможно ли (или даже желательно) перехватить это исключение и изменить таблицу / столбец, чтобы увеличить максимальную длину целевого столбца, а затем продолжить данные SqlBulkCopy, собирая следующий "чанк", который нужно скопировать, даже если вы этого не сделали совершил "вставку", с которой вы начали?
Итак, пытаясь перефразировать это, можно ли запустить транзакцию DML, остановиться в середине этой незафиксированной транзакции, выполнить DDL для изменения целевой таблицы, затем завершить исходный DML и зафиксировать его?
1 ответ
Чтобы ответить на ваш вопрос, можно изменить таблицу между операторами вставки. Если вы поместите транзакцию в каждую партию, вам потребуется откатить только 1 партию, чтобы обновить длину столбца. При таком подходе есть больше накладных расходов, чем установка длины столбца перед началом вставки данных.
Хорошим подходом было бы проверить максимальную длину каждого столбца исходных данных, а затем обновить целевую базу данных новыми длинами столбцов перед началом импорта данных. Таким образом, вы знаете, что целевая база данных может принять все данные, которые ей будут предоставлены.