SSIS не может вставить данные в таблицу, которая имеет вычисляемый столбец

У меня есть поток SSIS для вставки данных в таблицу. Этот поток работал нормально, пока модель данных не была обновлена ​​и не был добавлен вычисляемый столбец. Теперь, когда я пытаюсь загрузить данные, я получаю следующую ошибку:

Сообщения об ошибках SQL Server - Msg 271 - Столбец "" не может быть изменен, потому что это либо вычисляемый столбец, либо результат операции UNION.

Я нашел хорошее объяснение этого сообщения об ошибке здесь: Сообщения об ошибках SQL Server - Msg 271

Причина, по которой я обращаюсь к Stackru, заключается в том, что этот столбец фактически не отображается в моем потоке SSIS. Это означает, что мой компонент назначения OLEDB знает о существовании столбца, но для его сопоставления установлено значение<ignore column>. Так я отношусь к другим столбцам, таким как сгенерированные идентификаторы, и он всегда работает нормально.

Итак, отсюда вопрос: почему я получаю это сообщение об ошибке?

Однажды у меня возникла идея, что SSIS может автоматически генерировать операторы вставки SQL, которые сопоставляют nullзначения в этот вычисляемый столбец. Если это так, есть ли способ заставить SSIS полностью игнорировать существование столбца?

2 ответа

Я думаю, что проблема в том, что вы используете опцию быстрой загрузки при загрузке данных в OLE DB Destination, попробуйте использовать обычную загрузку таблицы, поскольку эта проблема может быть вызвана во время операций BULK INSERT.

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

У меня была такая же проблема после обновления с SQL Server 2016 до 2019 с некоторыми целевыми таблицами, которые содержали вычисляемые столбцы (которые были установлены как постоянные).

Поскольку целевые таблицы были размером около 1 ТБ каждая, перестроение не было реальным вариантом (или было только последним средством). Создание другой идентичной таблицы и использование ее в качестве цели не помогло.

Я обошел проблему, создав представление (v_<table_name>_insert_target_from_ssis), которое не делало ничего, кроме глупого SELECT из целевой таблицы (без каких-либо объединений, вычислений, где условия...) и имело все, кроме вычисляемых столбцов, в поле список. После использования этого фиктивного представления в качестве места назначения в службах SSIS задание импорта снова успешно выполняется.

Другим решением было отказаться от PERSISTEDиз вычисляемого столбца в таблице (или, в моем случае, из пустой копии, которую я создал для целей тестирования). Это может быть сделано с помощью

ALTER TABLE dbo.big_dwh_table ALTER COLUMN I_am_computed DROP PERSISTED

После этого изменения я также смог вставить в эту таблицу с помощью SSIS (но это было невозможно для исходной таблицы, потому что вычисляемый столбец использовался очень интенсивно)

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