it-swarm.com.de

SSIS Excel-Import erzwingt falschen Spaltentyp

Ich versuche, eine Tabelle mit SSIS in unsere Datenbank zu importieren. Aus irgendeinem Grund möchte SSIS davon ausgehen, dass zwei der Spalten vom Typ Double sind, wenn sie Zeichendaten enthalten. Ich habe versucht, die Spalten mit nvarchar (255) neu zuzuordnen, aber sie möchten immer noch nicht die Daten auswählen, von denen angenommen wird, dass sie doppelt sind, da darin Zeichen enthalten sind. Wenn ich versuche, das SSIS-Paket zu bearbeiten und die Spaltentypen in der Excel-Quelle zu ändern, kann ich den Typ der Spalten in der Fehlerausgabe nicht ändern und gibt einen Fehler aus, wenn die regulären Ausgabe- und Fehlerausgabespalten dies nicht tun Spiel.

Warum besteht SSIS darauf, dass diese Spalten Double sind? Wie kann ich es erzwingen, dass dies Strings sind? Warum muss alles von Microsoft nicht richtig funktionieren?

BEARBEITEN: Ich habe folgendes gefunden: http://support.Microsoft.com/kb/236605

Ich habe meine Daten so sortiert, dass gemischte Datentypen ganz oben stehen würden, und raten Sie, was: Das Problem umgekehrt. Anstatt Zeichendaten nicht zu importieren, wurden keine rein numerischen Daten mehr importiert. Anscheinend glaubt jemand nicht, dass 12345 als String dargestellt werden kann ...

45
CodeRedick

Ich habe dieses Problem schon einmal gesehen, es ist Excel, nicht SSIS. In Excel werden die ersten paar Zeilen abgetastet, und der Datentyp wird dann weitergeleitet, auch wenn Sie ihn explizit auf Text setzen. Sie müssen dies in die Excel-Dateiverbindungszeichenfolge im SSIS-Paket einfügen. Diese Anweisung teilt Excel mit, dass die Spalten gemischte Datentypen enthalten, und gibt an, zusätzliche Überprüfungen durchzuführen, bevor entschieden wird, dass es sich bei der Spalte um einen numerischen Typ handelt, obwohl dies nicht der Fall ist.

;Extended Properties="IMEX=1"

Damit sollte es funktionieren (in den meisten Fällen). Das sicherere Vorgehen ist, die Excel-Daten in durch Tabulatoren getrennten Text zu exportieren und diesen über SSIS zu importieren.

41
James

Sie können die Spaltendaten in Text konvertieren (dh erzwingen) ..... Versuchen Sie Folgendes (Hinweis: Diese Anweisungen basieren auf Excel 2007) ...

Die folgenden Schritte sollten Excel zwingen, die Spalte als Text zu behandeln:

Öffnen Sie Ihre Tabelle mit Excel.

Wählen Sie die gesamte Spalte aus, die Ihre "meist numerischen Daten" enthält, indem Sie auf die Spaltenüberschrift klicken.

Klicken Sie im Menüband auf die Registerkarte Daten.

Wählen Sie Text in Spalten aus. Dadurch wird der Assistent zum Konvertieren von Text in Spalten angezeigt.

-Auf Schritt 1: Klicken Sie auf Weiter

-Auf Schritt 2: Klicken Sie auf Weiter

-Auf Schritt 3: Wählen Sie Text aus und klicken Sie auf Fertig stellen

Speichern Sie Ihre Excel-Tabelle.

Wiederholen Sie den Import mit dem SQL Server 2005-Importdaten-Assistenten.

Hier ist auch ein Link zu einer anderen Frage, die zusätzliche Antworten enthält:

Daten importieren Wizard mag keinen Datentyp, den ich für eine Spalte auswähle

30
Joe L.

Eine Sache, die in der akzeptierten Antwort nicht erwähnt wird, ist, dass der Parameter "IMEX = 1" inside der zitierte Teil von:

...;Extended Properties="...";
13
RolandTumble

IMEX = 1; funktioniert nicht immer ... Alles über gemischte Datentypen in Excel: Gemischte Datentypen in Excel

enter image description here

7
Joost

Eine andere Problemumgehung besteht darin, die Kalkulationstabelle mit den Zeichendaten oben zu sortieren, wodurch Excel die Spalte als Zeichenfolge sieht und alles als solches importiert.

5
marks.chimp

Sie können die Registrierung auch ändern, um mehr Werte als nur die ersten 8 Zeilen anzuzeigen. Ich habe diese Methode verwendet und funktioniert sehr gut.

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

3
Jeremy C

Ich habe meinen Kopf für eine Weile mit diesem Thema gegen eine Wand geschlagen. In unserer Umgebung konsumieren wir Preisdateien von unseren Lieferanten in verschiedenen Formaten, von denen einige mehr als eine Million Rekorde aufweisen. Dieses Problem tritt normalerweise auf, wenn:

  • Die vom OLEDB-Treiber gescannten Zeilen scheinen Zahlen zu enthalten, enthalten jedoch später gemischte Werte im Datensatz oder
  • Felder enthalten nur Zahlen, die Quelle enthält jedoch einige Textformate (normalerweise Excel-Dateien).

Das Problem ist, dass selbst wenn Sie Ihre externe Eingabespalte auf den gewünschten Datentyp setzen, die Datei bei jeder Ausführung des Pakets geprüft wird und dynamisch in das geändert wird, was der OLEDB-Treiber für das Feld hält.

Unsere Quelldateien enthalten normalerweise Feldüberschriften (Text) und Preise (numerische Felder), was mir eine einfache Lösung gibt:

Erster Schritt:

  • Ändern Sie Ihre SQL-Anweisung so, dass sie die Header-Felder enthält. Dies zwingt SSIS, alle Felder als Text anzuzeigen, einschließlich der Preisfelder.

Für gemischte Felder:

  • Ihr anfängliches Problem ist behoben, da Ihre Felder jetzt aus Text bestehen, Sie jedoch immer noch eine Kopfzeile in Ihrer Ausgabe haben.
  • Verhindern Sie, dass die Headerzeile in Ihre Ausgabe aufgenommen wird, indem Sie die SQL-WHERE-Klausel ändern, um die Headerwerte auszuschließen, z. "WO NOT ([F4] = 'Price')"

Bei numerischen Feldern:

  • Setzen Sie im erweiterten Editor für die DB-Quelle OLE die Spalte Für das Preisfeld (oder ein beliebiges anderes numerisches Feld) auf einen numerischen DataType. Dies führt dazu, dass alle Datensätze, die Text in diesen Feldern enthalten, einschließlich des Kopfdatensatzes fehlschlagen, jedoch eine Konvertierung für numerische Werte erzwingen, die als Text gespeichert werden.

  • Stellen Sie die Fehlerausgabe so ein, dass Fehler in Ihren numerischen Feldern ignoriert werden.

  • Wenn Sie weiterhin Fehler in den umgeleiteten numerischen Feldern benötigen, entfernen Sie die Headerzeile. Ändern Sie dazu die SQL-WHERE-Klausel, um die Headerwerte auszuschließen.

  • Legen Sie die Fehlerausgabe fest, um Fehler in diesem Feld umzuleiten.

Natürlich funktioniert diese Methode nur dort, wo Sie Header-Felder haben, aber hoffentlich hilft das einigen von Ihnen.

1
Ryno

Ich habe folgendes Rezept verwendet:

  1. Importieren Sie Daten aus Excel in Access
  2. Importieren Sie Daten von Access zu SQL Server

und es hat für mich funktioniert ...

1
aldy sefan

Nun, IMEX = 1 hat bei mir nicht funktioniert. Reynier Booysens Vorschlag auch nicht. (Ich weiß nicht, ob es einen Unterschied macht, aber ich verwende SQL Server 2008r2). Eine gute Erläuterung einiger Problemumgehungen sowie Erklärungen, warum IMEX = 1 auf die ersten acht Zeilen jeder Tabelle beschränkt ist, finden Sie unter http://social.msdn.Microsoft.com/Forums/en-US/sqlintegrationservices/thread/78b87712-8ffe-4c72-914b-f1c031ba6c75

Hoffe das hilft

1
Alan Merriam

Ich hatte das gleiche Problem. Das Problem liegt in der Aufgabe Excel Source. Wenn Sie diese Task zum ersten Mal einrichten, stellt die Task eine Verbindung mit der angegebenen Excel-Datei her (über die Excel-Verbindung) und entscheidet, welcher Typ für jede Spalte auf der aktuellen Tabelle basiert. 

Wenn Sie also die Aufgabe Excel Source einrichten, müssen Sie nur sicherstellen, dass die Spalten, die Text sein sollen, nur Text in der Spalte haben. Dies bedeutet, dass die Task Excel Source immer davon ausgeht, dass alle nachfolgenden Kalkulationstabellen dasselbe Format haben und 12345 als Text lesen, da die Spalte Text war, als die Task eingerichtet wurde.

Hoffe es macht Sinn!

0
Reynier Booysen

Ich habe ein bisschen gebraucht, um die Fehlerquelle in meinem Paket zu erkennen. Letztendlich habe ich festgestellt, dass die Daten in null konvertiert wurden (Example: from "06" to "NULL"), und ich habe dies über die Vorschau in der Quelldateiverbindung (Excel Source> Edit> Connection Manager> Sheet='MySheet'> Preview...) gefunden. Ich war aufgeregt, als ich den Beitrag von James las, um die Verbindungszeichenfolge mit erweiterten Eigenschaften zu bearbeiten: ;Extended Properties="IMEX=1". Aber das hat bei mir nicht funktioniert. 

Ich konnte den Fehler beheben, indem ich das Zellenformat im Excel-Arbeitsblatt von "Nummer" in "Text" änderte. Nach dem Ändern des Formats wurde der Upload-Vorgang erfolgreich ausgeführt! Meine Verbindungszeichenfolge sieht folgendermaßen aus: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\myServer\d$\Folder1\Folder2\myFile.xlsx;Extended Properties="Excel 12.0 XML;HDR=NO";

Hier sind einige Screenshots, die meine Fehlermeldung behoben haben.

Fehler: Metadaten der Excel-Dateiverbindung enter image description here

Fehlerquelle: “Allgemeines” Format enter image description here

Fehlerquelle geändert: Textformat enter image description here

Fehler behoben: Metadaten der Excel-Dateiverbindung enter image description here

Ich hatte das gleiche Problem, mehrere Datentypwerte in einer Spalte, Paket laden nur numerische Werte. Bleibt alle als null aktualisiert. 

Lösung

Um dies zu beheben, ist das Ändern des Excel-Datentyps eine der Lösungen. In Excel Kopieren Sie die Spaltendaten und fügen Sie sie in eine andere Datei ein. Diese Spalte löschen und neue Spalte als Textdatentyp einfügen und die kopierten Daten in die neue Spalte einfügen.

Jetzt im ssis-Paket löschen und die Excel-QuellZieltabelle neu erstellen und die Spalte Datentyp als varchar ändern.

Das wird funktionieren.

Das hat bei mir funktioniert. Wählen Sie die problematische Spalte in Excel aus - markieren Sie die gesamte Spalte. Ändern Sie das Format in "Text". Speichern Sie die Excel-Datei.

Wechseln Sie in Ihrem SSIS-Paket zum Datenflussbereich für Ihren Import. Doppelklicken Sie auf den Knoten Excel-Quelle. Es sollte Sie warnen, dass sich die Typen geändert haben, und Sie werden gefragt, ob Sie sie neu zuordnen möchten. Klicken Sie auf Ja. Das Ausführen sollte jetzt funktionieren und alle Werte einbringen.

Hinweis: Ich verwende Excel 2013 und Visual Studio 2015, aber ich gehe davon aus, dass diese Anweisungen auch für frühere Versionen geeignet sind.

0
jaycer
  1. Klicken Sie im Menüband auf Datei, und klicken Sie dann auf Optionen.
  2. Klicken Sie auf Erweitert, und aktivieren Sie unter Bei der Berechnung dieser Arbeitsmappe das Kontrollkästchen Genauigkeit als Anzeige festlegen, und klicken Sie dann auf OK.

  3. OK klicken.

  4. Wählen Sie im Arbeitsblatt die Zellen aus, die Sie formatieren möchten.

  5. Klicken Sie auf der Registerkarte Start auf das Bild des Dialogfelds für die Starter-Schaltfläche neben Number.

  6. Klicken Sie im Feld Kategorie auf Nummer.

  7. Geben Sie im Feld Dezimalstellen die Anzahl der Dezimalstellen ein, die Sie anzeigen möchten.

Option 1. Verwenden Sie Visual Basic, um jede Spalte zu durchlaufen und jede Spalte als Text zu formatieren.

Verwenden Sie das Menü Text in Spalten, ändern Sie die Löschung nicht und ändern Sie "Allgemein" in "Text"

0
Aaron Ireland

Wenn in der Excel-Tabelle mehrere Spalten mit demselben Namen vorhanden sind, tritt diese Art von Fehler auf. Das Paket funktioniert, nachdem der Spaltenname eindeutig ist. Manchmal werden die ausgeblendeten Spalten beim Überprüfen der Spaltennamen ignoriert.

0