как задать текстовый разделитель запятых в файле формата BULK INSERT для столбцов, которые могут иметь нулевые значения - PullRequest
0 голосов
/ 10 апреля 2019

См. Этот небольшой образец моего CSV-файла:

"ID","TRANSACTION_TIME","CONTAINER_NUMBER","EVENT"
33115541,"2019-04-03 00:47:41.000000","MSKU1128096",
33115538,"2019-04-03 01:34:49.000000","MSKU1128096","Gate Out"
33115545,"2019-04-03 00:47:55.000000","MSKU4717839",

Это файл формата, который я создал

14.0
4
1 SQLCHAR 0 0 ",\""     2 ID                  ""
2 SQLCHAR 0 0 "\",\""   3 TRANSACTION_TIME    ""
3 SQLCHAR 0 0 "\",\""   4 CONTAINER_NUMBER    ""
4 SQLCHAR 0 0 "\"\r\n"  5 EVENT               SQL_Latin1_General_CP1_CI_AS

Проблема в том, что 4-й столбец может иметь нулевые значения, как вы можете видеть из строк 1 и 3 (исключая заголовок)

Смотрите ниже мою команду BULK INSERT

bulk insert dbo.DRISPIN_CONTAINER_HISTORY_STG1
from 'e:\dri_container_history_initial.csv'
with (
    firstrow = 2,
    formatfile = 'e:\container_history_initial.fmt'
)

Когда я запускаю это, я получаю следующую ошибку:

Сообщение 8152, Уровень 16, Состояние 13, Строка 305
Строка или двоичные данные будут проигнорированы.

Я также пытался указать длину префикса 2, но получил несколько разных ошибок.

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

Заранее спасибо

1 Ответ

0 голосов
/ 10 апреля 2019

Полная поддержка CSV была добавлена ​​в SQL Server 2017. Я подозреваю, что эта версия используется здесь, поскольку номер версии формата файла равен 14.0.

Следующая команда загрузит файл, используя двойную кавычку в качестве FIELDQUOTEсимвол и CRLF в качестве ограничителя строки:

create table testtable 
(
    "ID" bigint,
    "TRANSACTION_TIME" datetime2(0),
    "CONTAINER_NUMBER" varchar(200),
    "EVENT" varchar(200)
)


bulk insert dbo.testtable
from 'c:\path\to\testcsv.csv'
with ( 
    format='csv',
     FIRSTROW=2
)


select * from testtable

Результаты:

ID          TRANSACTION_TIME    CONTAINER_NUMBER    EVENT
33115541    2019-04-03 00:47:41 MSKU1128096         NULL
33115538    2019-04-03 01:34:49 MSKU1128096         Gate Out
33115545    2019-04-03 00:47:55 MSKU4717839         NULL

FORMAT = 'CSV' все еще не может обработать пропущенный символ новой строки в конце файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...