SQL Bulk insert XML format file с двойными кавычками в Терминаторе



Я пытаюсь вставить некоторые данные в таблицу из документа csv, в котором все поля разделены символом ""



Т. е.



 APPLICANTID,NAME,CONTACT,PHONENO,MOBILENO,FAXNO,EMAIL,ADDR1,ADDR2,ADDR3,STATE,POSTCODE
"3","Snoop Dogg","Snoop Dogg","411","","","","411 High Street","USA
","","USA", "1111" "4","LL Cool J","LL Cool J","","","","","5 King
Street","","","USA","1111"


Я использую файл формата xml, чтобы попытаться преодолеть разделители"", поскольку я считаю, что мне придется обновить данные снова после импорта, чтобы удалить inital", если это не так.



Мой формат файла выглядит следующим образом:



<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="NCharTerm" TERMINATOR='",' MAX_LENGTH="12"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="4" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="5" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="6" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="7" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="8" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="9" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="10" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="11" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/>
<FIELD ID="12" xsi:type="CharTerm" TERMINATOR="rn" COLLATION="Latin1_General_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="APPLICANTID" xsi:type="SQLINT"/>
<COLUMN SOURCE="2" NAME="NAME" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="CONTACT" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="PHONENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="MOBILENO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="6" NAME="FAXNO" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="7" NAME="EMAIL" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="8" NAME="ADDR1" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="9" NAME="ADDR2" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="10" NAME="ADDR3" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="11" NAME="STATE" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="12" NAME="POSTCODE" xsi:type="SQLCHAR"/>
</ROW>
</BCPFORMAT>


И я запускаю импорт со следующим:



BULK INSERT [PracticalDB].dbo.applicant 
FROM 'C:temp.csv'
WITH (KEEPIDENTITY, FORMATFILE='C:temp.xml', FIRSTROW = 2)


Я получаю ошибку:




Msg 4864, Уровень 16, состояние 1, строка 1 ошибка преобразования данных массовой загрузки
(несоответствие типа или недопустимый символ для указанной кодовой страницы) для
строка 2, столбец 1 (АППЛИКАНТИД).




Для всех строк.



Я пробовал различные комбинации для Терминатора, включая использование:



TERMINATOR="&quot;,"
TERMINATOR="","
TERMINATOR='","
TERMINATOR='","


И ни один из них, кажется, не работает.

Есть ли правильный способ избежать " так, чтобы он был правильно проанализирован, предполагая, что это моя проблема здесь.

719   3  

3 ответов:

Хорошо, я понял это!

Вы можете использовать 'вместо" когда вы определяете атрибуты xml ie TERMINATOR=", то вы можете использовать " внутри них, не беспокоясь.

Также мне нужно было съесть первый " с полем, чтобы другие столбцы могли быть правильно проанализированы. В итоге получился файл формата

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR='"' />
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="5" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="6" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="7" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="8" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="9" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="10" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="11" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="12" xsi:type="CharTerm" TERMINATOR='","' />
  <FIELD ID="13" xsi:type="CharTerm" TERMINATOR='"\r\n' />
 </RECORD>
 <ROW>
  <COLUMN SOURCE="2" NAME="APPLICANTID" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="3" NAME="NAME" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="4" NAME="CONTACT" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="5" NAME="PHONENO" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="6" NAME="MOBILENO" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="7" NAME="FAXNO" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="8" NAME="EMAIL" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="9" NAME="ADDR1" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="10" NAME="ADDR2" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="11" NAME="ADDR3" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="12" NAME="STATE" xsi:type="SQLNVARCHAR"/>
  <COLUMN SOURCE="13" NAME="POSTCODE" xsi:type="SQLCHAR"/>
 </ROW>
</BCPFORMAT>

Где первое поле-это просто выбросить одно, чтобы удалить первое "и другие поля все разделяются на", "И последнее отделяется на" (новая строка)

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

При манипуляции с содержимым поля можно делать все, что угодно, например, удалять двойные кавычки. Влияние на производительность здесь не упоминается, у меня нет никаких мер по этому поводу.

Совет: если ваш CSV-файл не имеет согласованного формата, например, в одном и том же столбце некоторые значения являются doubleqouted, а некоторые нет, то этот блог поможет вам сделать это простым способом (это продолжение подсказки Эстевеса, поскольку использование openrowset - это только последний шаг) http://ariely.info/Blog/tabid/83/EntryId/122/Using-Bulk-Insert-to-import-inconsistent-data-format-using-pure-T-SQL.aspx

Comments

    Ничего не найдено.