Как автоматически обрезать строку при вставке вставки?
Я хочу вставить много строк (построенных из объектов Entity Framework) в SQL Server. Проблема в том, что некоторые свойства строки имеют длину, превышающую длину столбца в базе данных, что вызывает исключение, а затем все строки не смогут вставляться в базу данных.
Итак, мне интересно, если есть способ сказать SqlBulkCopy автоматически обрезать любые строки по длине? Конечно, я могу проверить и подстроить каждое свойство, если оно превышает ограниченную длину, прежде чем вставлять его в DataTable, но это замедлит всю программу.
Ответы
Ответ 1
Всегда используйте таблицу промежуточных/загрузочных операций для массовых действий.
Затем вы можете обрабатывать, очищать, вычищать и т.д. данные перед тем, как погрузить в реальную таблицу. Это включает в себя: ВЛЕВО, поиск, удаление дубликатов и т.д.
Итак:
- Загрузите промежуточную таблицу с широкими столбцами
- Сброс из этапа в реальную таблицу с помощью
INSERT realtable (..) SELECT LEFT(..), .. FROM Staging
Ответ 2
К сожалению, нет прямого способа сделать это с помощью SqlBulkCopy
. SQL Bulk Inserts по своей природе почти "тупые", но почему они так быстро. Они даже не регистрируются (за исключением захвата события SqlRowsCopied
), поэтому, если что-то не удается, информации не так много. То, что вы искали, было бы в некотором роде, противоречит цели этого класса
Но возможны два возможных способа:
-
Вы можете попробовать использовать SqlBulkCopyOptions
Enumeration (передано SqlBulkCopy() Constructor) и использовать SqlBulkCopyOptions.CheckConstraints
(проверьте ограничения во время ввода данных. По умолчанию ограничения не отмечены.).
-
Или вы можете использовать SqlBulkCopyOptions.FireTriggers
Перечисление (если указано, заставляют сервер запускать триггеры вставки для вставленных строк в базу данных.) и обрабатывать исключение в SQL Server Insert Trigger
.
Ответ 3
Попробуйте использовать класс SQLTransaction при использовании класса SQLBulkCopy