SSIS-Import von Datum und Zeit aus einer txt in eine Tabelle datetime
So, ich möchte import datetime aus einem txt:
2015-01-22 09:19:59
in eine Tabelle mit einem Datenfluss. Ich habe meine Flat-Source-Datei und meinem Ziel-DB einrichten in Ordnung. Ich habe die Daten geben für die txt-Eingabe für die Spalte in die erweiterten Einstellungen und die input-und output-Eigenschaften:
Datenbank timestamp [DT_DBTIMESTAMP]
Dies ist der gleiche Datentyp wie die DB für die Tabelle, so sollte dies funktionieren.
Allerdings, wenn ich das Paket auszuführen, bekomme ich eine Fehlermeldung besagt, dass die Daten-Konvertierung fehlgeschlagen... Wie kann ich dies möglich machen?
[Import txt data [1743]] Error: Data conversion failed. The data conversion for column "statdate" returned status value 2 and status text "The value could not be converted because of a potential loss of data.".
[Import txt data [1743]] Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR. The "output column "statdate" (2098)" failed because error code 0xC0209084 occurred, and the error row disposition on "output column "statdate" (2098)" specifies failure on error. An error occurred on the specified object of the specified component. There may be error messages posted before this with more information about the failure.
[Import txt data [1743]] Error: An error occurred while processing file "C:\Program Files\Microsoft SQL Server\MON_Datamart\Sourcefiles\tbl_L30T1.txt" on data row 14939.
In der Zeile er den Fehler den datetime-aufgefüllt mit Leerzeichen. das ist der Grund, warum auf dem Tisch der "null zulassen" ist aktiviert aber mein SSIS-Paket gibt den Fehler aus irgendeinem Grund... kann ich irgendwo sagen, das Paket zu Nullen zulassen, aswell?
- timestamp <> datetime
- Was meinst du? Es sagt, "datetime", die auf den Datentyp in der Tabelle selbst, Und wenn ich überprüfen die Zuordnungen, die in der OLE DB-Ziel der Ziel-Spalte sagt die Datenbank timestamp. Dieser arbeitete in einem DTS-Paket (ich bin umwandeln) -> Zeitstempel = datetime
- In SQL Server haben wir die Datentypen datetime und timestamp (msdn.microsoft.com/en-us/library/ms187752.aspx). Entschuldige bitte, ich wusste gar nicht, dass Sie im SSIS -
DT_DBTIMESTAMP
zugeordnetdatetime
, wie die Namenskonvention ist nicht konsistent mit T-SQL. - Ja, ich verstehe gut, wie es scheint, tut es, da es deutlich sagt: "Datenbank timestamp" in die Spalte "Ziel" auf das OLE DB-Ziel. Haben Sie irgendwelche Vorschläge, was mein problem sein könnte und wie es zu lösen? Vielleicht ist die Konvertierung der Daten in Ordnung ist, aber dieser Fehler zeigt sich, da die Räume auf bestimmte Zeilen in der txt-Datei? Kann ich es akzeptieren null-Werte in einer bestimmten Spalte irgendwo, um zu verhindern, dass es wirft einen Fehler auf der leeren Zeilen?
- Vielleicht gibt es eine chance, dass das OLE DB-Ziel ist das Lesen der falschen Datentyp aus der Tabelle? Denn die Optionen, die ich habe für die Daten-Typen sind, und ich sehe nicht, datetime überall... imgur.com/YBNuOru Also, vielleicht ist es das Lesen nur der Daten-Typen von SSIS-weiß wich nicht enthalten datetime
- Können Sie dump die Werte der CSV in einem varchar-Feld vorübergehend, so können die Daten abgefragt werden? Es ist möglich, dass Sie einen Tag haben, wie
2015-02-00...
(d.h. ein ungültiges Datum) oder2015-02-12 14:37:39.123456
(d.h. die Präzision höher ist als der Datentyp zulässt... oder ähnliches - Ich würde-Ausgabe, die Spalte als Zeichenfolge geben Sie die Quelle und senden Sie es zu einem Datentyp-Konvertierung Komponente mit einem Fehler-Ausgang, so konnte ich sehen, was Werte sind nicht in der Lage zu sein, in Datumsangaben umgewandelt. Das würde wahrscheinlich geben einen guten Hinweis darauf, was Los ist.
- gvee, wie ich schrieb in meiner ursprünglichen Frage es ist so: 2015-01-22 09:19:59
- Tab, das habe ich schon, aber ich ersetzt die Datentyp-Konvertierung durch die Anpassung der Datentypen, die in der Wohnung Quelldatei. Das funktioniert und gibt mir den gleichen Fehler (siehe meine ursprüngliche Frage für den Fehler, über das, was Werte nicht te umgewandelt werden)
- Ich habe gerade überprüft die original DTS-Datei und fand heraus, was das problem ist. Einige Zeilen der statdate Spalte in der TXT-Datei, die ich importieren sind leer. Sie haben nicht den Wert wie der rest (2015-01-22 09:19:59), sondern die Zeile in dieser Spalte ist gefüllt mit LEERZEICHEN. Das DTS-Paket hatte ein activeX-Skript, um zu verhindern, dass diese Werte filles mit Leerzeichen an die Datenbank geschickt werden und damit den Wert "NULL". Dies ist das script: If (IsDate(Trim(DTSSource("statdate")))) Dann DTSDestination("statdate") = DTSSource("statdate") End If Main = DTSTransformStat_OK
- Ich brauche eine Lösung erkennen, wenn es Leerzeichen anstelle eines Zeitstempels und wenn es Räume (string) anstelle von timestamp-es sollte NICHT gesendet, das an den OLE DB-Ziel, so bekommt es den Wert "NULL". Was lege ich zwischen meine Flatfile-Quelle und der OLE DB abzufangen, in diese Räume und schickte Sie NULL statt? Ich wäre in der Lage, dies zu tun mit einem Ausdruck, aber wie kann ich einen Ausdruck zwischen den in meine DATEN FLIEßEN
- Wenn ich wählen Sie die Spalte mit dem Zeitstempel im inneren und setzen Sie den error-Ausgang auf "Fehler ignorieren" es FUNKTIONIERT, es sendet alle Zeitstempel auf die Tabelle und die Zeilen mit Leerzeichen anstelle eines Zeitstempels zu bekommen ignoriert und er die Ausgänge "NULL" (das ist die Ausgabe, die ich will)! Jetzt brauche ich nur jemanden, der mir hilft und mir sagen, wie ich ihn ignorieren die Zeilen mit Leerzeichen mit einem expresion oder was auch immer funktioniert in den Datenfluss, so dass ich nicht brauchen, um es auf ingore scheitern, da, wenn etwas anderes dann das Leerzeichen ist falsch, ich muss noch einen Fehler, so dass der controll-flow erstellen Sie eine Sicherungskopie der Datei...
- Hallo Michael. Um ehrlich zu sein, mein Ansatz wäre zum importieren in ein character-Feld, und dann analysieren, sobald die Seite geladen wurde mithilfe von T-SQL. Aber das ist nur meine bevorzugte Methodik im ETL-Zeug. Wenn Sie wirklich wollen, zu bewältigen, dass es auf dem Weg mit Ihrem ActiveX-Skript, dann müssen Sie erweitern Ihre Prüfung (Stell ich mir
IsDate()
ist Rückgabe von true für leere Werte). Versuchen:If (IsDate(Trim(DTSSource("statdate"))) And Trim(DTSSource("startdate")) <> "" ) Then ...
. Lassen Sie mich wissen, wie Sie auf (tag mir in einem Kommentar durch Eingabe von @gvee) - Man könnte ein TRIM () - Funktion in der Daten-Konvertierung und einer IIF() zu ersetzen, die leere Zeichenfolgen mit NULL.
- Wie würde ich importieren Sie Sie in ein character-Feld, und tun es mit T_SQL? Wenn es funktioniert, ich bin offen dafür. Aber das script das du mir mit würde wahrscheinlich funktionieren, aber die Frage bleibt, wo ich schreiben kann das Skript? Kann ich nicht ein Skript Aufgabe innerhalb eines data-flow (dies ist nur möglich in der controll flow), so dass ich nicht weiß, wo man eigentlich schreiben, dass ein Skript in die Daten fließen... Auch ich weiß nicht, was <> "" würde funktionieren, da die Zeilen, ich muss abgelehnt werden, nicht leer ( "" ), aber Sie Leerzeichen enthalten. Ich brauche es zu erkennen Leerstellen.
- Wo würde ich die trim-Funktion? Ich kann nirgendwo finden, um es in der Daten fließen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich schlage vor, Sie importieren die Daten in ein character-Feld, und dann analysieren und es nach der Einreise.
Folgende Funktion sollte dir helfen:
Den
IsDate()
- Funktion gibt eine 1, wenn es denkt der Wert ein Datum und eine 0 wenn es nicht ist.Dies würde es Ihnen ermöglichen, etwas zu tun:
IsDate()
Funktion ist nicht perfekt, so vorsichtig behandelnIch löste es Selbst. Vielen Dank für Ihren Vorschlag gvee, aber so wie ich es Tat, es ist einfacher.
In der Flatfile-Quelle wenn Sie eine neue Verbindung in der Registerkarte "erweitert" habe ich Fix alle Daten-Typen entsprechend der Tabelle in der Datenbank mit AUSNAHME der Spalte mit dem timestamp (in meinem Fall hieß es "statdate")! Ich änderte diese Daten geben einen STRING, weil sonst meine Flatfile-Quelle würde mir ein Fehler bei der Konvertierung, noch bevor alle Skripts, die in der Lage gewesen wären, um ausgeführt zu werden und der einzige Weg, um diese Einstellung war, die Fehler Ausgang Fehler ignorieren, die ich nicht will. (Sie haben noch zu ändern, den Datentyp, nachdem Sie es eingestellt, um eine Zeichenfolge in die erweiterten Einstellungen durch Rechtsklick auf die Flatfile-Quelle -> show advanced editor -> geht auf den Ausgang Spalten und ändern der Daten-Typ es von Datum zu string.)
Nachdem Sie die timestamp wurde gesetzt um einen string, ich habe eine Abgeleitete Spalte mit diesem Ausdruck zum löschen aller Leerzeichen und geben Sie dann den Wert "NULL":
TRIM(<YourColumnName>) == "" ? (DT_STR,4,1252)NULL(DT_STR,4,1252) : <YourColumnName>
Als Nächstes fügte ich eine Daten-Konvertierung, um die Zeichenfolge zurück, um einen Zeitstempel. Die Datenkonvertierung ist schließlich verbunden mit dem OLE DB Ziel.
Ich hoffe, dies hilft jemand mit dem gleichen problem in die Zukunft.
Endergebnis: Bild des Datenflusses