Fehler in SQL Server beim Importieren einer CSV-Datei, obwohl für jede Spalte varchar (MAX) verwendet wird

70

Ich versuche, eine große CSV-Datei (mehrere Gigs) einzufügen SQL Server, aber sobald ich Import Wizarddie Datei durchgehe und schließlich versuche, die Datei zu importieren, erhalte ich den folgenden Fehlerbericht:

  • Ausführen von (Fehler-) Nachrichten

Fehler 0xc02020a1: Datenfluss Aufgabe 1: Datenkonvertierung fehlgeschlagen. Die Datenkonvertierung für die Spalte "" Titel "" ergab den Statuswert 4 und den Statustext "Text wurde abgeschnitten oder ein oder mehrere Zeichen stimmten nicht mit der Zielcodepage überein."

( SQL Server Import and Export Wizard)

Fehler 0xc020902a: Datenfluss Aufgabe 1: Die Ausgabe "Source - Train_csv.Outputs [Flat File Source Output] .Columns [" Title "]" ist fehlgeschlagen, da das Abschneiden der Zeilen in "Source - Train_csv.Outputs [Flat File Source" erfolgt ist Ausgabe] .Columns ["Title"] "gibt einen Fehler beim Abschneiden an. Für das angegebene Objekt der angegebenen Komponente ist ein Kürzungsfehler aufgetreten.

( SQL Server Import and Export Wizard)

Fehler 0xc0202092: Datenfluss Aufgabe 1: Bei der Verarbeitung der Datei "C: \ Train.csv" in Datenzeile 2 ist ein Fehler aufgetreten.

( SQL Server Import and Export Wizard)

Fehler 0xc0047038: Datenfluss Aufgabe 1: SSIS-Fehlercode DTS_E_PRIMEOUTPUTFAILED. Die PrimeOutput-Methode für Source - Train_csv hat den Fehlercode 0xC0202092 zurückgegeben. Die Komponente hat einen Fehlercode zurückgegeben, als die Pipeline-Engine PrimeOutput () aufgerufen hat. Die Bedeutung des Fehlercodes wird von der Komponente definiert, der Fehler ist jedoch schwerwiegend und die Pipeline wurde nicht mehr ausgeführt. Möglicherweise wurden zuvor Fehlermeldungen mit weiteren Informationen zum Fehler veröffentlicht.

( SQL Server Import and Export Wizard)

Ich habe die Tabelle erstellt, in die die Datei zuerst eingefügt werden soll, und ich habe jede Spalte so eingestellt, dass sie varchar (MAX) enthält, sodass ich nicht verstehe, wie ich dieses Problem mit dem Abschneiden noch haben kann. Was mache ich falsch?

GMS
quelle
Schauen Sie sich die zweite Datenzeile an. Zwei wahrscheinliche Ursachen sind leere Felder und / oder Kommas im Feld.
Dan Bracuk
Ich habe die zweite Zeile überprüft und das Feld in jeder Spalte sieht gut aus. Kein Leerzeichen, kein NULL, keine Kommas.
GMS

Antworten:

180

Im SQL Server-Import- und Export-Assistenten können Sie die Quelldatentypen auf der AdvancedRegisterkarte anpassen (diese werden beim Erstellen einer neuen Tabelle zu den Datentypen der Ausgabe, werden aber ansonsten nur zur Verarbeitung der Quelldaten verwendet).

Die Datentypen sind nervend anders als die in MS SQL, statt VARCHAR(255)es ist DT_STRund die Ausgangsspaltenbreite kann eingestellt werden 255. Denn VARCHAR(MAX)es ist DT_TEXT.

AdvancedÄndern Sie daher in der Datenquellenauswahl auf der Registerkarte den Datentyp aller fehlerhaften Spalten von DT_STRin DT_TEXT(Sie können mehrere Spalten auswählen und alle gleichzeitig ändern).

Import- und Exportassistent - Datenquelle - Erweitert

Hart CO
quelle
1
Es sieht so aus, als hätte dies den Trick getan, nachdem ich die Spaltenlängen maximiert hatte! Vielen Dank
GMS
2
Ich hatte Spalten zu ändern DT_DATE, DT_NUMERICusw. Das war das langweiligste und ärgerlich , was ich int eine Zeit lang getan habe. Es ist jedoch besser, als eine neue Tabelle mit allen varchar (50) -Spalten zu erstellen. Das ist wirklich nicht hilfreich.
Jess
1
Dies funktionierte auch für mich, obwohl keine der Daten länger als 55 Zeichen war, als sie in SQL Server waren. Seltsam ...
John Pasquet
1
Ich habe es gefunden! Ich suchte nach einem "Tab" über dem oberen
Rand
2
Wenn ich Suggest Types...alle 6000 Zeilen verwende und scannen lasse, ändert sich seltsamerweise der Längenwert aller Spalten, vermutlich auf den höchsten Wert, auf den sie gestoßen sind, aber der Fehler bleibt bestehen. Die einzige Lösung für mich war, sie alle zu ändern DT_TEXT. Es dauerte ewig, die beleidigenden Spalten einzeln zu finden.
Sinjai
1

Diese Antwort ist möglicherweise nicht universell anwendbar, hat jedoch das Auftreten dieses Fehlers behoben, auf den ich beim Importieren einer kleinen Textdatei gestoßen bin. Der Flatfile-Anbieter importierte basierend auf festen 50-stelligen Textspalten in der Quelle, was falsch war. Keine Neuzuordnung der Zielspalten hatte Auswirkungen auf das Problem.

Um das Problem zu beheben, wird unter "Wählen Sie eine Datenquelle" für den Flatfile-Anbieter nach Auswahl der Datei unter der Eingabespaltenliste die Schaltfläche "Typen vorschlagen .." angezeigt. Nachdem Sie auf diese Schaltfläche geklickt haben, hat der Flat File-Anbieter die CSV-Quelldatei erneut abgefragt und die Länge der Felder in der Quelldatei korrekt ermittelt , auch wenn keine Änderungen am Dialogfeld "Verwenden" vorgenommen wurden .

Sobald dies erledigt war, wurde der Import ohne weitere Probleme fortgesetzt.

David W.
quelle
0

Ich denke, es ist ein Fehler. Bitte wenden Sie die Problemumgehung an und versuchen Sie es erneut: http://support.microsoft.com/kb/281517 .

Gehen Sie auch zur Registerkarte Erweitert und bestätigen Sie, ob die Länge der Zielspalten Varchar (max) ist.

Sonam
quelle
Sie sind definitiv Varchar (MAX). Ich ging auch in Erweitert und machte jede Spaltenbreite 8000 Zeichen. Jetzt erhalte ich diesen Fehler nur für die letzte Spalte.
GMS
0

Der erweiterte Editor hat mein Problem nicht behoben. Stattdessen musste ich die dtsx-Datei über den Editor (oder Ihren bevorzugten Text- / XML-Editor) bearbeiten und die Werte in den Attributen manuell ersetzen

length="0" dataType="nText" (Ich benutze Unicode)

Erstellen Sie immer eine Sicherungskopie der dtsx-Datei, bevor Sie sie im Text- / XML-Modus bearbeiten.

Ausführen von SQL Server 2008 R2

dbd
quelle
0

Gehen Sie zur Registerkarte Erweitert ----> Datentyp der Spalte ---> Ändern Sie hier den Datentyp von DT_STR in DT_TEXT und die Spaltenbreite 255. Jetzt können Sie überprüfen, ob er einwandfrei funktioniert.

Lokesh
quelle
Welche Registerkarte "Erweitert"? Ich sehe keine solche Registerkarte
Casey Crookston
@ Hart CO sollte ein Bild des Verbindungsassistenten zeigen, das die erweiterte Registerkarte hat, von der ich
Sam
0

Problem: Der Jet OLE DB-Anbieter liest einen Registrierungsschlüssel, um zu bestimmen, wie viele Zeilen gelesen werden sollen, um den Typ der Quellenspalte zu erraten. Standardmäßig ist der Wert für diesen Schlüssel 8. Daher durchsucht der Anbieter die ersten 8 Zeilen der Quelldaten, um die Datentypen für die Spalten zu ermitteln. Wenn ein Feld wie Text aussieht und die Datenlänge mehr als 255 Zeichen beträgt, wird die Spalte als Notizfeld eingegeben. Wenn also in den ersten 8 Zeilen der Quelle keine Daten mit einer Länge von mehr als 255 Zeichen vorhanden sind, kann Jet die Art des Datentyps nicht genau bestimmen. Da die ersten 8 Zeilen mit Daten im exportierten Blatt weniger als 255 betragen, wird die Quelllänge als VARCHAR (255) betrachtet und es können keine Daten aus der Spalte mit größerer Länge gelesen werden.

Fix: Die Lösung besteht darin, die Kommentarspalte in absteigender Reihenfolge zu sortieren. Ab 2012 können wir die Werte auf der Registerkarte "Erweitert" im Importassistenten aktualisieren.

Tapas
quelle