2009-06-24 17 views
15

Lange Rede, kurzer importieren, ich nehme eine Reihe von Excel-Dokumente eins nach dem anderen, und importieren sie den Import/Export-Assistenten in eine Datenbank in SQL Server 2005Kürzungsfehler auf SQL Server 2005 von Excel

Hier ist ein Bericht (alle nicht gezeigten Prozesse sind ein "Erfolg"). Gibt es eine Möglichkeit für mich, Trunkierungsfehler zu ignorieren? Ich habe vergeblich gegoogelt, oder zumindest nicht in meiner Version.

- Executing (Success) 

- Copying to [Datadev].[dbo].[Sheet0$] (Error) 
    Messages 
    * Error 0xc020901c: Data Flow Task: There was an error with output 

Spalte "Wert Bedeutung Beschreibung" (234) auf Ausgang "Excel Quelle Output" (9). Der zurückgegebene Spaltenstatus war: "Text wurde abgeschnitten oder ein oder mehrere Zeichen hatten keine Übereinstimmung in der Codepage Ziel .". (SQL Server-Import und Export-Assistenten)

* Error 0xc020902a: Data Flow Task: The "output column "Value 

Bedeutung Beschreibung "(234)" failed weil Abschneiden aufgetreten ist, und die Abschneiden Reihenanordnung auf "Ausgang Spalte "Wert Bedeutung Beschreibung" (234)" Gibt den Fehler Trunkierung an. Ein Trunkierungsfehler trat am angegebenen Objekt der angegebenen Komponente auf. (SQL Server-Import und Export-Assistenten)

* Error 0xc0047038: Data Flow Task: SSIS Error Code 

DTS_E_PRIMEOUTPUTFAILED. Die PrimeOutput-Methode für die Komponente "Source - Sheet0 $" (1) zurückgegeben Fehler Code 0xC020902A. Die Komponente hat einen Fehlercode zurückgegeben, wenn die Pipeline-Engine PrimeOutput() aufgerufen hat. Die Bedeutung des Fehlercodes ist definiert durch die Komponente, aber der Fehler ist fatal und die Pipeline gestoppt Ausführung. Es kann einen Fehler Nachrichten geben, die vorher mit mehr Informationen über den Fehler bekanntgegeben werden. (SQL Server-Import und Export-Assistenten)

* Error 0xc0047021: Data Flow Task: SSIS Error Code 

DTS_E_THREADFAILED. Thread "SourceThread0" wurde mit Fehler Code 0xC0047038 beendet. Es kann einen Fehler Nachrichten geben, die vorher mit mehr Informationen darüber veröffentlicht werden, warum der Thread beendet hat. (SQL Server-Import und Export-Assistenten)

* Error 0xc0047039: Data Flow Task: SSIS Error Code 

DTS_E_THREADCANCELLED. Thread "WorkThread0" erhielt eine Abschaltung Signal und wird beendet. Der Benutzer hat eine Abschaltung angefordert, oder ein Fehler in ein anderer Thread verursacht, dass die Pipeline heruntergefahren wird. Möglicherweise gibt es einen Fehler Nachrichten, die zuvor mit mehr Informationen darüber, warum der Thread abgebrochen wurde. (SQL Server-Import und Export-Assistenten)

* Error 0xc0047021: Data Flow Task: SSIS Error Code 

DTS_E_THREADFAILED. Thread "WorkThread0" wurde mit Fehler Code 0xC0047039 beendet.Es kann einen Fehler Nachrichten geben, die vorher mit mehr Informationen darüber veröffentlicht werden, warum der Thread beendet hat. (SQL Server-Import und Export-Assistenten)

- Post-execute (Success) 
    Messages 
    * Information 0x402090df: Data Flow Task: The final commit for the 

Einfügen von Daten begonnen. (SQL Server-Import und Export-Assistenten)

* Information 0x402090e0: Data Flow Task: The final commit for the 

Einfügen von Daten beendet ist. (SQL Server-Import und Export-Assistenten)

- Cleanup (Success) 
    Messages 
    * Information 0x4004300b: Data Flow Task: "component "Destination - 

Sheet0 $ "(323)", schrieben 210 Zeilen. (SQL Server-Import und Export-Assistent)

Antwort

8

Der Assistent verwendet einen kleineren Wert als Standard-Varchar-Größe für Excel-Daten, den Sie im Assistenten in SQL Server 2000 erhalten. Daher schneidet er häufig Daten ab, die Sie schnell in eine Zwischenspeichertabelle importieren möchten . Wenn Sie den Assistenten ausführen, werden Sie jedoch auf einem Bildschirm gefragt, ob Sie Zuordnungen bearbeiten möchten, und Sie können die Größe der Felder dort festlegen. Oder Sie können zuerst eine Tabelle erstellen, um eine Arbeitstabelle mit den gewünschten Größen zu erstellen (nvarchar (max) ist gut, wenn Sie die Daten zum ersten Mal betrachten und keine Ahnung haben, wie groß die Felder sein sollen) und importieren Sie dann hinein. Mit Excel weiß ich, dass ich auch Probleme mit SQl Server hatte, indem ich nur ein paar Zeilen benutzte, um den Datentyp zu bestimmen, und dann das Einfügen für Datensätze fehlschlug, weil es dachte, dass es eine ganze Zahl war war wirklich eine Zeichenfolge Art von Daten. Sie könnten auch ein Problem wie dieses haben, daher ist es eine gute Idee, die Mappings trotzdem zu überprüfen, auch wenn Sie keine Trunkierungsfehler erhalten.

+3

Ich erhalte den Abbruchfehler mit einem Feld, das Werte mit einer maximalen Länge von 10 Zeichen enthält. Selbst wenn ich den Abbruchfehler für das Feld ignoriere, erhalte ich den Fehler. Ist das ein bekanntes Problem? –

1

Warum möchten Sie Fehler ignorieren? Warum sie nicht finden und reparieren?

In jedem Fall sollten Sie SSIS (SQL Server Integration Services) direkt verwenden, wenn Sie mehr ausführen müssen, als vom Assistenten bereitgestellt wird. Das ist, was der Assistent verwendet, nur kann es nicht davon ausgehen, dass Fehler in Ordnung sind.

Es ist sehr einfach, ein SSIS-Paket zu schreiben, um Ihre Excel-Dateien zu durchlaufen und einzeln zu importieren. Der Importdatenfluss kann so konfiguriert werden, dass Fehler ignoriert werden oder etwas anderes mit ihnen gemacht wird, wie sie gemeldet werden.

+0

Dies ist eine kleine Aufgabe, die ich mit buchstäblich Tausenden von Spalten insgesamt mache. Es ist etwas unlogisch (in meiner Situation), jeden von Hand zu reparieren. Danke für die SSIS-Info. – scrot

+0

Wie logisch das ist, hängt davon ab, wie oft das Problem aufgetreten ist und was es verursacht. Wenn Sie sich beispielsweise diese Fehlermeldungen genau ansehen, sehen Sie, dass es sich um eine abgeschnittene oder falsche Codepage handelt. Ersteres kann nur eine Frage der Verwendung einer breiteren Spalte sein; Letzteres kann eine Frage von einigen Nicht-ASCII-Zeichen sein. –

15

Wenn ich Kürzungsfehler erhalte, füge ich 8 Dummy-Zeilen ein. Jede Zelle hat Junk-Text mit einer Länge> 256. Dies erzwingt, dass der erkannte Datentyp varchar (max) anstelle von varchar (256) ist. Wenn eine Zeile eine Zahlenspalte ist, muss ich sie mit einer Zahl (z. B. 0) ausfüllen, und wenn es sich um ein Datum handelt, muss ich ein Dummy-Datum eingeben, sonst werden die Spalten mit Nulldaten importiert.

Ich lösche diese Junk-Zeilen nach dem Import.

+2

Das hat es für mich getan, einfach und effizient. Eine Dummy-Reihe war genug. – Olaf

+1

In meinem Fall war es genug, die erste Zeile auf diese Weise zu bearbeiten und nicht 8. –

+1

Dies ist die beste Antwort, auch für SQL Server 2012+ – CSS

1

Für gelegentliche Importe von Excel-, CSV- oder Textdaten in SQL Server, bei denen Kürzungsfehler auftreten, würde ich vorschlagen, die Daten zuerst in MS Access zu importieren und anschließend den Tabellenassistenten direkt zu erstellen und zu befüllen SQL.

5

Here's was für mich funktionierte.

Dies ist aufgrund einer wunderbaren Einstellung innerhalb von Excel in Ihrer Registrierung, dass es nur die ersten 8 Zeilen von Daten in Ihrer Tabelle zu überprüfen, um die Spaltengröße für den Rest aller Daten zu bestimmen. Das Problem besteht darin, Ihre Registrierung so zu ändern, dass sie von 8 auf 0 gesetzt wird. Wenn sie auf 0 gesetzt ist, wird die gesamte Tabelle überprüft.Dies kann zu einigen Leistungsproblemen beim ersten Datenimport führen, wenn die Datei extrem groß ist. Hier ist der Schlüssel Registry zu suchen (es kann mehr als eine sein, die eingestellt werden muss):

TypeGuessRows

+0

Das erklärt es. Sie müssen keine Dummy-Zeilen einfügen, da Sie diese Dummy-Zeilen später sowieso löschen müssen. Erstellen Sie stattdessen eine zusätzliche Spalte in Ihrer Excel-Datei, die Zeichen zählen "= LEN (Cell #) für die Spalte, die fehlschlägt, dann sortieren Sie diese Spalte nach DESCENDING. Auf diese Weise hat die Zelle die meisten Zeichen in den obersten Zeilen, der Import .... hoffe es hilft – Milacay

4

http://support.microsoft.com/kb/281517

Um den Wert TypeGuessRows zu ändern, verwenden Sie die folgenden Schritte: 1.Klicken Sie im Startmenü auf Ausführen. Geben Sie in dem Dialogfeld Ausführen Regedt32 ein, und klicken Sie dann auf OK. 2.Open die folgenden Schlüssel in der Registry-Editor:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel

Hinweis Für 64-Bit-Systemen, die entsprechende Taste wird wie folgt:

HKLM \ SOFTWARE \ wow6432node \ Microsoft \ Jet \ 4.0 \ Engines \ Excel 3. Doppelklicken Sie auf TypeGuessRows. 4. Klicken Sie im Dialogfeld DWORD-Editor unter Basis auf Dezimal. Geben Sie einen Wert zwischen 0 und einschließlich 16 für Wertdaten ein. 5.Klicken Sie auf OK, und beenden Sie den Registrierungseditor. Eine zweite Möglichkeit, um dieses Problem zu umgehen (ohne die Registrierung zu ändern) besteht darin, sicherzustellen, dass Zeilen mit Feldern, die Daten 255 Zeichen oder größer haben, in den ersten 8 Zeilen der Quelldatei vorhanden sind.

+0

Auf welchem ​​Computer? der Executer oder wo der SQL installiert? –

0

Wenn Sie im SQL Server-Importassistenten zu dem Abschnitt gelangen, in dem Sie die Datei angeben müssen, die Sie zum Importieren von Daten verwenden, klicken Sie auf die Optionen "Erweitert". Dies zeigt Ihnen alle Felder in Ihrer Eingabedatei zusammen mit den Feldeigenschaften. Die Eigenschaft, die Sie ändern müssen, ist "DataType". Normalerweise wird "string [DT_STR]" verwendet. Wenn Sie es in "Text Stream [DT_TEXT]" ändern, erhöhen Sie die Größe des Felds erheblich und vermeiden daher wahrscheinlich den Kürzungsfehler.