Sql Bulk insert-Datei im XML-format, die mit doppelten Anführungszeichen in terminator
Ich versuche, fügen Sie Daten in eine Tabelle aus einer csv-Dokument, das alle Felder getrennt mit ""
ie.
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"
Bin ich mit einer Datei im xml-format, um zu versuchen und zu überwinden, die "" als Trennzeichen ich glaube, ich würde das update nochmal die Daten nach dem Import zu löschen, die inital " wenn es nicht.
Mein format-Datei sieht wie folgt aus:
<?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="\r\n" 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>
und bei mir läuft der import mit den folgenden:
BULK INSERT [PracticalDB].dbo.applicant
FROM 'C:\temp.csv'
WITH (KEEPIDENTITY, FORMATFILE='C:\temp.xml', FIRSTROW = 2)
Bin ich immer die Fehlermeldung:
Msg 4864, Ebene 16, Status 1, Zeile 1-Bulk-load-Daten-Konvertierungs-Fehler
(Typenkonflikt oder ungültiges Zeichen für die angegebene codepage) für
Zeile 2, Spalte 1 (APPLICANTID).
für alle Zeilen.
Ich habe versucht, verschiedene Kombinationen für die terminator-einschließlich der Verwendung:
TERMINATOR="","
TERMINATOR="\","
TERMINATOR='","
TERMINATOR='\","
und keiner von Ihnen scheint zu arbeiten.
Gibt es eine richtige Art und Weise zu entkommen ", damit es korrekt analysiert werden, vorausgesetzt, dass ist mein problem hier.
InformationsquelleAutor Daniel Powell | 2011-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, so habe ich es herausgefunden!
Können Sie 'statt" bei der Definition der xml-Attribute ie TERMINATOR=", dann kann man das " in Ihnen, ohne sich Gedanken.
Auch ich brauchte zu Essen, die erste " mit einem Feld, so dass die anderen Spalten konnte, werden jetzt korrekt analysiert. Dies endete mit der format-Datei
Wo das erste Feld ist nur wegwerfen, ein entfernen des ersten " und die anderen Felder, die alle separat auf "," und das Finale trennt "(newline)
InformationsquelleAutor Daniel Powell
Tipp: wenn Sie nur einige der Felder sind doubleqouted, dann verwenden Sie die
openrowset
version von der bulk insert -, und damit können Sie manipulieren den Inhalt des Feldes aus der input-Dateivor dem einfügen in die Zieltabelle.
In der manipulation können Sie etwas tun mit dem Inhalt des Feldes, z.B. entfernen von doppelten Anführungszeichen. Die Wirkung auf die Leistung ist hier nicht erwähnt, ich habe keine Maßnahmen in Bezug auf diese.
InformationsquelleAutor Estevez
Tipp: wenn Sie Ihre CSV-Datei nicht in einheitlichem format, zum Beispiel in DER GLEICHEN SPALTE einige Werte sind doubleqouted und einige nicht, als dieser blog wird Ihnen helfen, tun es auf eine einfache Weise (dies ist ein weiter Estevez Tipp, wie Sie die openrowset ist nur der Letzte Schritt)
http://ariely.info/Blog/tabid/83/EntryId/122/Using-Bulk-Insert-to-import-inconsistent-data-format-using-pure-T-SQL.aspx
InformationsquelleAutor Ronen Ariely