Как автоматически обрезать строку при вставке вставки?

Я хочу вставить много строк (построенных из объектов 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