2013-05-01 3 views
1

Я загружаю данные из файла CSV, разделенного по каналам, на SQL Server. Данные отформатированы какМассовая вставка Включает терминатор линии

| B | CCCCCC \ г \ п

Я подтверждено и что файл в формате UTF-8 и строки оканчиваются «\ г \ п» при просмотре CSV-файл в шестнадцатеричном редакторе.

Команда

BULK INSERT MyTable FROM 'C:\Path\File.csv' 
WITH (FIRSTROW=1, MAXERRORS=0, BATCHSIZE=10000, FIELDTERMINATOR = '|', 
     ROWTERMINATOR = '\r\n') 

Третий столбец первоначально был определен как CHAR (6), так как это поле всегда код ровно 6 (ASCII) символов в ширину. Это привело к ошибке усечения во время объемной вставки.

Затем я расширил колонку до CHAR (8). Импорта работала, но

SELECT CAST(Col3 As VARBINARY(MAX)) 

указывает на то, что данные столбца заканчивается 0x0D0A (или «\ г \ п», строка терминатора)

Почему строка Терминатор включается в импортируемых данных и как я могу это исправить?

ответ

1

Короче говоря, SQL Server не поддерживает UTF-8, и вам нужно всего лишь \n в качестве терминатора строк.

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

create table dbo.BCPTest (
    col1 nchar(1) not null, 
    col2 nchar(1) not null, 
    col3 nchar(6) not null 
) 

/* This data can saved as ASCII, UTF-16 with BOM or UTF-8 without BOM 
    (see comments below) 

A|B|CCCCCC 
D|E|FFFFFF 

*/ 

BULK INSERT dbo.BCPTest FROM 'c:\testfile.csv' 
WITH (FIELDTERMINATOR = '|', ROWTERMINATOR = '\n') 

Комментарии:

  • Когда я создан и сохранен в блокноте, как «UTF-8», он добавил BOM байтов 0xEFBBBF, который стандарт UTF-8 BOM
  • Но SQL Server doesn't support UTF-8, it supports UTF-16 (Официальные документы here) и expects спецификация из 0xFFFE
  • так что я снова сохранил файл в блокноте, как «Unicode», и добавил 0xFFFE BOM; этот загруженный тон, как показано выше. Из любопытства я сохранил его (с помощью Notepad ++), как «UTF-8 без BOM», и я мог бы загрузить файл слишком
  • Сохранение файла как ASCII также загружает отлично с теми же типами данных таблицы и BULK INSERT команды
  • The строка terminator должна быть \n не \r\n, потому что \n является interpreted as a "newline", т.е. SQL Server (и/или Windows) является «умным», интерпретируя \n семантически, а не буквально. Это, скорее всего, результат C handling\r и \n, что не требует их толкования буквально.
+0

Это был ROWTERMINATOR. –

Смежные вопросы