Проблемы с разделителем строк при массовой вставке - PullRequest
0 голосов
/ 25 апреля 2018

Позвольте мне привести некоторые подробности, и тогда, я надеюсь, проблема прояснится. Данные ограничены знаком |. Причиной этого является то, что некоторые поля должны содержать запятые, и из-за этого csv сделает его слишком сложным.

Пример данных

12007|0|10|70|0|2017|1|1|Some County, Nevada|Total Covered|10 Total,all industries
12007|0|10|70|0|2017|2|1|Some County, Nevada|Total Covered|10 Total,all industries

Создать табличный скрипт

 create table test (
 area_fips varchar(5),
 own_code varchar(1),
 industry_code varchar(6),
 agglvl_code varchar(6),
 size_code varchar(2),
 year varchar(50),
 qtr varchar(50),
 Disclosure_code varchar(50),
 area_title varchar(50),
 own_title varchar(50),
 industry_title varchar(254)
 );

Команда массовой вставки

 bulk insert test
 From 'Q:\folder\test1.txt'
 WITH (firstrow=2,FORMATFILE='Q:\folder\xml1.xml',
 ERRORFILE='Q:\folder\error4.txt'
 );

Файл формата XML

  <?xml version="1.0"?>
  <BCPFORMAT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format">
  -<RECORD>
  <FIELD MAX_LENGTH="5" TERMINATOR="|" xsi:type="CharTerm" ID="1"/>
  <FIELD MAX_LENGTH="1" TERMINATOR="|" xsi:type="CharTerm" ID="2"/>
  <FIELD MAX_LENGTH="6" TERMINATOR="|" xsi:type="CharTerm" ID="3"/>
  <FIELD MAX_LENGTH="6" TERMINATOR="|" xsi:type="CharTerm" ID="4"/>
  <FIELD MAX_LENGTH="2" TERMINATOR="|" xsi:type="CharTerm" ID="5"/>
  <FIELD MAX_LENGTH="50" TERMINATOR="|" xsi:type="CharTerm" ID="6"/>
  <FIELD MAX_LENGTH="50" TERMINATOR="|" xsi:type="CharTerm" ID="7"/>
  <FIELD MAX_LENGTH="50" TERMINATOR="|" xsi:type="CharTerm" ID="8"/>
  <FIELD MAX_LENGTH="50" TERMINATOR="|" xsi:type="CharTerm" ID="9"/>
  <FIELD MAX_LENGTH="50" TERMINATOR="|" xsi:type="CharTerm" ID="10"/>
  <FIELD MAX_LENGTH="200" TERMINATOR="\r\n" xsi:type="CharTerm" ID="11"/>
  </RECORD>
  -<ROW>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="areafips" SOURCE="1"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="owncode" SOURCE="2"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="indcode" SOURCE="3"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="agglvlcode" SOURCE="4"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="sizecode" SOURCE="5"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="year" SOURCE="6"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="qtr" SOURCE="7"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="disclosurecode" SOURCE="8"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="areatitle" SOURCE="9"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="owntitle" SOURCE="10"/>
  <COLUMN xsi:type="SQLNVARCHAR" NAME="industrytitle" SOURCE="11"/>
  </ROW>
  </BCPFORMAT>

Сообщение об ошибке

  Msg 4832, Level 16, State 1, Line 15
  Bulk load: An unexpected end of file was encountered in the data file.

Файл ошибок

  Row 2 File Offset 161 ErrorFile Offset 0 - HRESULT 0x80004005

  12007|0|10|70|0|2017|2||Some County, Nevada|Total

  Covered12007|0|10|70|0|2017|2||Some County, Nevada|Total Covered

Похоже, что он не распознает I между 10-м и 11-м полями. Он распознает их раньше, но на последнем он терпит неудачу.

  1. Правильно ли задан терминатор строки "\ r \ n"?
  2. Любые другие идеи о том, почему он не функционирует должным образом?

1 Ответ

0 голосов
/ 26 апреля 2018

Ответ не так запутан, как вопрос.В любом случае, это заняло 6 недель, но я понял.

  BULK INSERT dbo.test
  FROM 'Q:\folder\test1.txt'
  WITH
  (
  FIELDTERMINATOR = '|'
  );

У меня сложилось впечатление, что если это 123,45, то мне нужно обозначить его как числовое (5.2) в файле формата.Ну, видимо, нет.Нет форматирования файла и пропускается разделитель строк, и он хорошо импортируется.

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