Загрузка данных из файла в таблицу SQL Server приводит к ошибке EOF и правому усечению - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь загрузить данные из файла в таблицу SQL Server. Я использую следующую команду bcp:

bcp [dbo].[DSUpstreamFileDetails] in "c:\BackLogTable.dat" 
    -c -t0x1C -S abc.database.secure.windows.net -d abc-U asd-P sda

Но я получаю следующую ошибку

SQLState = 22001, NativeError = 0
Ошибка = [Microsoft] [ODB C Драйвер 13 для SQL Сервер] Строковые данные, усечение справа

SQLState = 22001, NativeError = 0
Ошибка = [Microsoft] [ODB C Драйвер 13 для SQL Сервер] Строковые данные, правое усечение

SQLState = 22001, NativeError = 0
Ошибка = [Microsoft] [ODB C Драйвер 13 для SQL Сервер] Строковые данные, правое усечение

SQLState = 22001, NativeError = 0
Ошибка = [Microsoft] [ODB C Драйвер 13 для SQL Сервер] Строковые данные, усечение справа

SQLState = S1000, NativeError = 0
Ошибка = [Microsoft] [ODB C Драйвер 13 для SQL Сервер] В файле данных BCP обнаружен непредвиденный EOF

Это данные во входном файле

   ICE_DATASRCNG_TRANS_ONPREM_INBOUND_LOADING#GCW#hp#SHIPMENT#AMS#TRANSACTION#DAILY#E:\ICE_Data\DataProviders\GCW\HPINDIRECT\SHIPMENT#/Dataproviders/Landing/GCW/HPIndirect/Shipment/AMS#gcw_hp_indirect_shipment_ams_658_20200303_04_38_08.dat##Backlog#2020-03-06 10:37:36#2020-03-06 10:37:43#1
ICE_DATASRCNG_TRANS_ONPREM_INBOUND_LOADING#EDW#ord#ORDER#ALL#TRANSACTION#DAILY#E:\ICE_Data\EDW#/DataProviders/Landing/KAI/Order#edw_ord_extr_3x_SIQP_20200306.035105.dat##Backlog#2020-03-06 10:37:50#2020-03-06 10:38:01#1
ICE_DATASRCNG_TRANS_ONPREM_INBOUND_LOADING#EDW#ship#SHIPMENT#ALL#TRANSACTION#DAILY#E:\ICE_Data\EDW#/DataProviders/Landing/KAI/Ship#edw_ship_extr_3x_SIQP_20200306.035052.dat##Backlog#2020-03-06 10:38:09#2020-03-06 10:38:18#1
ICE_DATASRCNG_TRANS_ONPREM_INBOUND_LOADING#GRS#REBATES#REBATES#AMS#TRANSACTION#WEEKLY#E:\ICE_Data\GRS_ORION#/DataProviders/Landing/Rebates/AMS#GRS_ICE_AMS_20200302.100847.dat##Backlog#2020-03-06 10:38:24#2020-03-06 10:38:26#1
ICE_DATASRCNG_TRANS_ONPREM_INBOUND_LOADING#GRS#REBATES#REBATES#APJ#TRANSACTION#WEEKLY#E:\ICE_Data\GRS_ORION#/DataProviders/Landing/Rebates/APJ#GRS_ICE_APJ_20200302.100647.dat##Backlog#2020-03-06 10:38:30#2020-03-06 10:38:33#1
ICE_DATASRCNG_TRANS_ONPREM_INBOUND_LOADING#ORION#REBATES#REBATES#AMS#TRANSACTION#WEEKLY#E:\ICE_Data\GRS_ORION#/DataProviders/Landing/Rebates/AMS#Orion_ICE_AMS_20200302.100208.dat##Backlog#2020-03-06 10:38:38#2020-03-06 10:38:46#1
ICE_DATASRCNG_TRANS_ONPREM_INBOUND_LOADING#FCM#REBATES#REBATES#AMS#TRANSACTION#WEEKLY#E:\ICE_Data\Zyme#/DataProviders/Landing/Rebates/AMS#FCM_Columbus_AMS_20200302.213013.dat##Backlog#2020-03-06 10:38:50#2020-03-06 10:39:00#1
ICE_DATASRCNG_TRANS_ONPREM_INBOUND_LOADING#FCM#REBATES#REBATES#APJ#TRANSACTION#WEEKLY#E:\ICE_Data\Zyme#/DataProviders/Landing/Rebates/APJ#FCM_Columbus_APJ_20200302.213013.dat##Backlog#2020-03-06 10:39:05#2020-03-06 10:39:06#1
ICE_DATASRCNG_TRANS_ONPREM_INBOUND_LOADING#FCM#REBATES#REBATES#EMEA#TRANSACTION#WEEKLY#E:\ICE_Data\Zyme#/DataProviders/Landing/Rebates/EMEA#FCM_Columbus_EMEA_20200302.213013.dat##Backlog#2020-03-06 10:39:11#2020-03-06 10:39:18#1

Разделитель полей: (\ 034) или 0x1 C. Для удобства чтения я заменил разделитель полей на # в приведенных выше данных.

В таблице уже есть несколько строк.

Поэтому я сделал небольшую проверку, могу ли я импортировать существующие данные в таблице в локальный файл, обрезать данные в таблице, а затем перезагрузить данные из локального файла. Это был успех.

загрузка в локальный файл

bcp [dbo].[DSUpstreamFileDetails] out "c:\BackLog.dat" -c -t0x1C -S abc.database.secure.windows.net -d abc-U abc -P abc

загрузка данных в таблицу

bcp [dbo].[DSUpstreamFileDetails] in "c:\BackLogTable.dat" -c -t0x1C -S abc.database.secure.windows.net -d abc-U abc-P abc

Как решить проблему правильного усечения пользовательского файла что я использую?

Я использовал переключатели -n, -N и -c, но напрасно.

Терминатором строки является CRLF ('\ r \ n') в входной файл.

1 Ответ

0 голосов
/ 06 марта 2020

(\ 034) или 0x1 C - это код ASCII для двойных кавычек. Это не будет go хорошо с SQL данными. Возможно, вы захотите заменить разделители другим кодом ASCII перед импортом на SQL Сервер. Попробуйте использовать тильду (126).

...