Файл BCP загружен не полностью, когда ошибка числового значения вне диапазона встречается 10 раз

Я пытаюсь импортировать файл с разделителями табуляции в SQL. Одно из полей в БД decimal(15,2), Но файл, который я получаю, может иметь некоторые экспоненциальные значения, такие как -2.702159776E17 который явно не подходит для поля у меня в БД.

Проблема в том, что если в этом экспоненциальном файле более 10 записей, BCP не загружается в полные данные. Как только он встречает 10-й экземпляр экспоненциального значения, он пропускает оставшуюся часть файла.

Я использую ниже BCP команду для загрузки данных:

dbname.dbo.tablename in "filelocation" -c -F 2 -b 10000 -h "TABLOCK" -T -S servername

Файл, который я пытаюсь импортировать, содержит 200 000 записей. Но мы ясно видим, что обработано только 18 000 записей, остальные пропущены. Выход из ПП, как показано ниже.

Starting copy...
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range
SQLState = 22003, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]Numeric value out of range

18149 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 265    Average : (68486.79 rows per sec.)

1 ответ

Решение

Посмотрите на следующую опцию BCP:

-m max_errors Задает максимальное количество синтаксических ошибок, которые могут возникнуть до отмены операции bcp. Синтаксическая ошибка подразумевает ошибку преобразования данных в целевой тип данных. Итоговое значение max_errors исключает любые ошибки, которые могут быть обнаружены только на сервере, например нарушения ограничений.

Строка, которая не может быть скопирована утилитой bcp, игнорируется и считается одной ошибкой. Если этот параметр не включен, по умолчанию используется значение 10.

Вы можете видеть, что по умолчанию 10 ошибок. Укажите этот параметр и укажите очень большое значение, если хотите пропустить все ошибки.

Если вы хотите импортировать все записи, вы можете импортировать записи в промежуточную таблицу, которая имеет FLOAT тип данных вместо DECIMAL(15,2), Затем скопируйте данные из промежуточной таблицы в таблицу, в которую вы хотите данные, преобразовав значение с плавающей запятой в десятичное значение.

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