Benutzer mit den meisten Antworten
Datenkonvertierungsfehler bei csv-Datenimport von Numeric-Felder mit Nachkommastelle (Statuswert 2)

Frage
-
Hallo zusammen,
ich habe eine csv-Datei und die Felddefintion aus dem ERP-System Int(zzz,zz9.99). In der angelegten Tabelle auf dem SQL-Server habe ich das Feld einmal als numeric (6,2) und auch als decimal (6,2) definiert. Da die CSV-Datei scheinbar keine brauchbaren Formate hat und ich auch in Excel vorher als Versuch das Format der Spalte geändert habe, habe ich im Datenfluss eine Konvertierung vor dem Mapping gesetzt. Hier kommt der Fehler nach execute Task:
[Datenkonvertierung [47]] Fehler: Datenkonvertierungsfehler beim Konvertieren der Breite-Spalte (141) in die Kopie von 'Breite'-Spalte (91). Die Konvertierung gab den Statuswert '2' und den Statustext 'Der Wert konnte aufgrund eines möglichen Datenverlustes nicht konvertiert werden.' zurück.
In der Ziel OLE-Zieltabelle kommt nichts an, der Job bricht bei 9500 Datensätzen ab und ich erkenne in der csv-Datei keinen Unterschied in dem Datensatz der den Fehler verursachen könnte. Ein Import als char(50) macht keine Probleme. Ich habe die Konvertierung mit Numerisch [DT_NUMERRIC] und auch als Decimal[DT_DECIMAL] vorgenommen (mit 8 0 oder mit 6 2 usw.). Es erscheint immer die Fehlermeldung :( Numeric ohne Nachkommastellen lassen sich importieren. Hat die ev. etwas mit dem Komma/Punkt zu tun und wie umgehe ich dieses Problem?
Was läuft da schief :( Vielen Dank für eure Tipps!
Gruß Chris
- Bearbeitet Controller123 Freitag, 22. Januar 2016 16:45
Antworten
-
Hi,
nuja, man könnte noch versuche, eine schema.ini im Verzeichnis der Importdatei abzulegen. Allerdings bin ich mir nicht sicher, ob diese von dem von dir verwendeten Importer auch angesprochen wird.
In den schema.ini kannst Du recht viel festlegen, u.a. die Namen und Datentypen der einzelnen Spalten und eben auch das Dezimaltrennzeichen.
https://msdn.microsoft.com/en-us/library/ms709353.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Montag, 25. Januar 2016 17:35
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 28. Januar 2016 08:50
- Als Antwort markiert Aleksander Chalabashiev Montag, 1. Februar 2016 09:08
Alle Antworten
-
Hallo Chris,
zeig doch mal den Inhalt ggfs. problematischer Zeilen.
Zahlenwerte sollten als 123.45 vorliegen, nicht als 123,45.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Christian,
falls dein Spaltentrenner auch das Komma sein sollte, hast Du eh halbwegs verloren. In dem Fall bleibt dir eigentlich nur, die Importtabelle um eine weitere Spalte für die Nachkommastellen zu erweitern. Falls es aber bspw. 123 anstelle von 123,0 gibt, wird es eklig bis unmöglich, wenn der Ersteller der CSV Datei den Spaltentrenner nicht ändert.
Falls das Komma nur in den Zahlenwerten vorkommt, kannst Du evtl. vorher eine Ersetzung von , durch . vornehmen. Falls das Komma auch in anderen (bspw. Text)Spalten vorkommen kann, wäre es sinnvoller, den Import in eine separate Tabelle durchzuführen, die (zumindest für die problematischen Zahlenwerte) nur aus varchar Spalten besteht. Anschließend führst Du dort per REPLACE( <Spalte>, ',', '.' ) die Ersetzungen durch und importierst die Daten in die Zieltabelle.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo,
"zzz,zz9.99" benötigt maximal decimal(8,2) - denn die Zahl der Nachkommstellen gehen ab. Sollte sich in der 9500 Zeile eine größere Zahl als 9999,99 finden so wäre das schon die Ursache.
Alternativ könntest Du wie bereits versucht, die Daten als varchar importieren und die Konvertierung selbst vornehmen. Was dann notwendig sein könnte wenn nicht Dezimalpunkt und -komma gemischt auftauchen - sollte zwar nicht, gibt es aber immer mal wieder ;(
Gruß Elmar
-
Hallo zusammen,
als char(8) also Zeichenfolge [DT_STR] lässt es sich importieren und auch die Werte sind stets unter 10000. Die Felder sind immer sauber mit Simikolon getrennt, aber leider kann die IT mir das Format nur die deutsche Kommatrennung liefern. Da gibt es auch keine Ausnahmen, so dass die Formate immer gleich sind. Ein vorheriges suche ersetzte ist keine Option, da die Datei täglich aktualisiert wird. Dadurch, dass ich jetzt anfange die Faktentabellen zu übernehmen wird es kompliziert und sehr aufwendig mit Zwischentabellen zu arbeiten.
Auf Zeichenfolge [DT_STR] 8 zu konvertieren schlägt dann fehl, sobald ich in die Zieltabelle schreiben will, da diese numerisch ist (Datentypkonflikt). Mit Measures zu arbeiten, die als Char(8) definiert sind, finde ich recht unschön, da ich dann jedesmal eine Konvertierungsabfrage im Vorfeld schalten müsste.
Puh, gibt keine andere Lösung hier ev. das Problem zu umgehen? Vielen Dank für weitere Tipps!
Gruß Chris
-
Hi,
nuja, man könnte noch versuche, eine schema.ini im Verzeichnis der Importdatei abzulegen. Allerdings bin ich mir nicht sicher, ob diese von dem von dir verwendeten Importer auch angesprochen wird.
In den schema.ini kannst Du recht viel festlegen, u.a. die Namen und Datentypen der einzelnen Spalten und eben auch das Dezimaltrennzeichen.
https://msdn.microsoft.com/en-us/library/ms709353.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Montag, 25. Januar 2016 17:35
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 28. Januar 2016 08:50
- Als Antwort markiert Aleksander Chalabashiev Montag, 1. Februar 2016 09:08
-
Hallo zusammen,
mir ist es immer noch ein Rätzel: Ich habe im csv-fila in einem Feld leere Einträge und max.ein Wert von 82023. Konvertiert habe ich auf Nummerisch 10. Bei Satz 2998 kommt ein Konvertierungsfehler mit Status 2. Davor sind auch zig leere Sätze übernommen. Als char(10) geht die Konvertierung, aber es kann doch nicht sein, dass ich viele Felder als Text konvertiere und dann wieder umwandeln muss :(
Hier der Fehler
[Datenkonvertierung [95]] Fehler: SSIS-Fehlercode 'DTS_E_INDUCEDTRANSFORMFAILUREONERROR'. Fehler bei 'Datenkonvertierung.Ausgaben[Ausgabe der Datenkonvertierung].Spalten[Kopie von 'HerRefNr']' aufgrund des Fehlercodes 0xC020907F. Die Fehlerzeilendisposition in 'Datenkonvertierung.Ausgaben[Ausgabe der Datenkonvertierung].Spalten[Kopie von 'HerRefNr']' gibt an, dass der Vorgang bei einem Fehler nicht ausgeführt werden kann. Es wurde ein Fehler im angegebenen Objekt der angegebenen Komponente festgestellt. Möglicherweise wurden bereits Fehlermeldungen veröffentlicht, die weitere Fehlerinformationen beinhalten.
-
Hi,
ohne deine Importdatei und die exakte Struktur der Tabelle, in die importiert werden soll, kann man da leider rein gar nichts sagen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
die csv-Datei liefert wie oben beschrieben Zahlenfelder mit Nachkommastelle und auch Leerzeichen, daher teilweise auch die anderen Fehler beim Konvertieren. Lösung: Mit replace lösche ich die Leerzeichen und Punkte und mache aus dem Komma ein Punkt, damit ich mit Cast (Feld as decimal (15,2)) summierbare Ergebnisse erhalten. Bei 170.000 Datensätze braucht der Bericht unter SSRS ca. 20 Sek. Das geht alles gar nicht :(
Das mit Zwischentabellen und Konvertieren ist ein Wahnsinnsaufwand bei der Erstellung des DWH, insbesondere weil ich viele Measures habe. Das mit der ini-Datei und dem Importerproblem habe ich nicht so richtig verstanden, aber gibt es keinen eleganten Weg hier die Daten aus der CSV-Datei als Zahl zu importieren. Ich nutze unter Visual Studio im Projekt den Assitenten :(
Vielen Dank & Gruß
Christian
-
Hallo Christian,
ich kann mich nur wiederholen:
ohne deine Importdatei und die exakte Struktur der Tabelle, in die importiert werden soll, kann man da leider rein gar nichts sagen.
Es gibt natürlich einen eleganten Weg, die Daten einer CSV Datei auch korrekt als Zahl, Datum, ... zu interpretieren: Derjenige, der den Export erzeugt, soll sich an das von dir benötigte Format halten. Die Krücken, die Du jetzt basteln musst, wären dann nicht notwendig.
Alternativ geh halt hin und leg im Verzeichnis, in dem die zu importierenden CSV Datei(en) liegt(liegen), eine Datei namens schema.ini an und füll diese mit dem passenden Inhalt. Viele Import/Exportmechanismen beachten diese Datei und wenn ein Abschnitt für die aktuell zu importierende Datei enthalten ist, werden dort dann auch auch die Formatspeifikationen verwendet. Ob das auch für deinen Importer gilt, kann ich grad nicht sagen.
Dann käme ggfs. noch BULK INSERT als Importalternative in Betracht. Ob das bei deinem Dateiformat klappen würde, müsstest Du selbst mal schauen.
https://msdn.microsoft.com/de-de/library/ms188365.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan,
jetzt habe ich nochmals ein konkretes Beispiel. Ich habe eine Datumsspalte die teilweise mit LERR-Einträgen gefüllt ist. Die Zieltabelle ist als Liefertermin (date,NULL) definiert. Ein direkter Import schlägt fehlt. Konvertiere ich die Spalte mit dem Konvertierungs-Editor mittels Datum [DT_DATE] erhalte ich schon in der Konvertierungsstufe eine Fehlermeldung. Lösche ich die Datensätze mit den Leereinträgen, gibt es keine Probleme mit dem Import.
Warum kann ich in der Zieltabelle ein Datums-Feld definieren was NULL-Einträge zulässt, wobei beim Konvertieren für den Import die Konvertierung wegen der NULL-Einträge fehlt schlägt? Wie kann ich den Fehler ggf. mit Bordmitteln bei der Konvertierung umgehen?
Vielen Dank.
Gruß Chris
-
Hallo Chris,
ein Leerstring ist nicht NULL.
Ich würde dir wegen der ganzen Probleme empfehlen, den Import in eine separate Tabelle vorzunehmen, bei der alle problematischen Spalten als varchar/nvarchar definiert sind.
Anschließend kannst Du mit den SQL Möglichkeiten den eigentlichen Übertrag in die Zieltabelle vornehmen und dabei dann auch konvertieren, NULLIF, ISNULL, REPLACE, usw. verwenden und die Probleme damit umgehen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community