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="","
TERMINATOR="","
TERMINATOR='","
TERMINATOR='","
И ни один из них, кажется, не работает.
Есть ли правильный способ избежать " так, чтобы он был правильно проанализирован, предполагая, что это моя проблема здесь.
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
- есть Вики по адресу http://social.technet.microsoft.com/wiki на основе этот блог, если вы предпочитаете читать с сайта Microsoft.
Comments