Wie behebe ich 'ungültiger Zeichenwert für die Cast-Spezifikation' in einer Datumsspalte in der Flat-Datei?

7

Ich habe eine CSV-Datei mit einem {LF}, der jede Zeile und eine Datumsspalte mit dem Datumsformat als "12/20/2010" (einschließlich Anführungszeichen) begrenzt

Meine Zielspalte ist eine SQL Server 2008-Datenbanktabelle vom Typ date (nicht datetime)

In meinem Flat File Connection Manager habe ich die Datumsspalte als Datentyp date [DT_DATE] konfiguriert, wobei TextQualified auf true und das Spaltentrennzeichen auf {LF} gesetzt ist (Es ist die letzte Spalte in jeder Zeile). Ich habe den Textqualifikator auf "

gesetzt

Wenn ich versuche, das in ein OLE-Ziel zu laden, erhalte ich den folgenden Fehler

  

[TRN_DORPS [760]] Fehler: SSIS-Fehlercode DTS_E_OLEDBERROR. Ein OLE DB-Fehler ist aufgetreten. Fehlercode: 0x80004005.   Ein OLE DB-Datensatz ist verfügbar. Quelle: "Microsoft OLE DB Provider für SQL Server" Hresult: 0x80004005 Beschreibung: "ungültiger Zeichenwert für Cast-Spezifikation.".   [TRN_DORPS [760]] Fehler: Es gab einen Fehler mit der Eingabespalte "" CYCLE_DATE "" (874) am Eingang "OLE DB Destination Input" (773). Der zurückgegebene Spaltenstatus war: "Der Wert konnte wegen eines möglichen Datenverlusts nicht konvertiert werden.".

Wenn ich einen Datenviewer anschließe, ist der Wert in der Pipeline 2010-12-20 00:00:00.0000000 - ist diese Zeitkomponente das, was das Problem verursacht? Ich versuche, die Zeitkomponente mit (DT_DATE)(DT_DBDATE)[CYCLE_DATE] zu entfernen, aber ohne Erfolg, da es in der Pipeline gleich bleibt.

    
manning18 02.09.2011, 19:42
quelle

3 Antworten

17

Ich konnte schließlich die Lösung auflösen, indem ich den Spaltentyp in der flachen Dateiverbindung auf den Typ "Datenbankdatum [DT_DBDATE]"

setzte

Offensichtlich sind die Unterschiede zwischen diesen Datumsformaten wie folgt:

DT_DATE Eine Datumsstruktur, die aus Jahr, Monat, Tag, und Stunde besteht.

DT_DBDATE Eine Datumsstruktur, die aus Jahr, Monat und Tag besteht.

DT_DBTIMESTAMP Eine Timestamp-Struktur, die aus Jahr, Monat, Stunde, Minute, Sekunde und Bruch besteht.

Durch Ändern des Spaltentyps in DT_DBDATE wurde das Problem gelöst - ich habe einen Datenviewer angefügt und der CYCLE_DATE-Wert war jetzt einfach "12/20/2010" ohne eine Zeitkomponente, die das Problem scheinbar löste.

    
manning18 06.09.2011, 13:59
quelle
35

Um das Problem zu simulieren, mit dem Sie konfrontiert sind, habe ich das folgende Beispiel mit SSIS 2008 R2 mit SQL Server 2008 R2 backend erstellt. Das Beispiel basiert auf dem, was ich aus Ihrer Frage gewonnen habe. Dieses Beispiel bietet keine Lösung, aber es könnte Ihnen helfen, zu identifizieren, wo das Problem in Ihrem Fall sein könnte.

Erstellt eine einfache CSV-Datei mit zwei Spalten, nämlich Bestellnummer und Bestelldatum. Wie Sie in Ihrer Frage erwähnt haben, sind die Werte beider Spalten mit doppelten Anführungszeichen (") versehen und die Zeilen enden mit Zeilenvorschub (\ n), wobei das Datum die letzte Spalte ist. Der folgende Screenshot wurde mit Notepad ++ , das die Sonderzeichen in einer Datei anzeigen kann. LF im Screenshot kennzeichnet Zeilenschaltung.

Eine einfache Tabelle namens dbo.Destination in der SQL Server-Datenbank erstellt, um die CSV-Dateidaten mit dem SSIS-Paket zu füllen. Erstellen Sie ein Skript für die Tabelle unten.

%Vor%

Im SSIS-Paket habe ich zwei Verbindungsmanager erstellt. SQLServer wurde mithilfe der OLE DB-Verbindung zur Verbindung mit der SQL Server-Datenbank erstellt. FlatFile ist ein einfacher Dateiverbindungs-Manager.

Der Verbindungsmanager für flache Dateien wurde konfiguriert, um die CSV-Datei zu lesen, und die Einstellungen werden unten angezeigt. Die roten Pfeile zeigen die vorgenommenen Änderungen an.

Hat dem Verbindungsmanager für flache Dateien einen Namen gegeben. Zum Speicherort der CSV-Datei geblättert und den Dateipfad ausgewählt. Das doppelte Anführungszeichen ( " ) wurde als Textqualifizierer eingegeben. Das Begrenzungszeichen für die Kopfzeile wurde von {CR} {LF} in {LF} geändert. Diese Änderung der Titelzeilenbegrenzung spiegelt auch den Abschnitt Spalten wider.

Im Abschnitt Spalten wurden keine Änderungen vorgenommen.

Der Spaltenname wurde von Column0 in OrderNumber geändert.

Der Spaltenname wurde von Column1 in OrderDate geändert und auch der Datentyp in date [DT_DATE]

geändert

Die Vorschau der Daten im Verbindungsmanager für flache Dateien sieht gut aus.

Auf der Registerkarte Control Flow des SSIS-Pakets wurde ein Data Flow Task platziert.

Innerhalb der Datenflusstask wurde ein Flat File Source und ein OLE DB Destination .

platziert

Das Flat File Source wurde konfiguriert, um die CSV-Dateidaten mit dem FlatFile-Verbindungsmanager zu lesen. Im Folgenden zeigen drei Screenshots, wie die Flat-File-Quellkomponente konfiguriert wurde.

Die OLE DB Destination -Komponente wurde so konfiguriert, dass sie die Daten aus der Flat File Source akzeptiert und sie in die SQL Server-Datenbanktabelle dbo.Destination einfügt. Im Folgenden zeigen drei Screenshots, wie die OLE DB-Zielkomponente konfiguriert wurde.

Mit den in den folgenden 5 Screenshots erwähnten Schritten habe ich einen Daten-Viewer für den Fluss zwischen der Flat File Source und dem OLE DB-Ziel hinzugefügt.

Bevor ich das Paket ausgeführt habe, habe ich die in der Tabelle vorhandenen Ausgangsdaten verifiziert. Es ist momentan leer, da ich es mit dem Skript erstellt habe, das zu Beginn dieses Posts bereitgestellt wurde.

Das Paket wurde ausgeführt und die Paketausführung vorübergehend unterbrochen, um die Daten anzuzeigen, die von der Flat File Source zum OLE DB-Ziel im Datenviewer fließen. Ich habe auf den Run-Button geklickt, um mit der Ausführung fortzufahren.

Das Paket wurde erfolgreich ausgeführt.

Flache Dateiquelldaten wurden erfolgreich in die Tabelle dbo.Destination eingefügt.

Hier ist das Layout der Tabelle dbo.Destination. Wie Sie sehen können, hat das Feld Bestelldatum den Datentyp Datum und das Paket fügt die Daten weiterhin korrekt ein.

Dieser Beitrag ist zwar keine Lösung. Hoffentlich hilft es Ihnen, herauszufinden, wo das Problem in Ihrem Szenario sein könnte.

    
user756519 03.09.2011 16:02
quelle
0

Der richtige Datentyp für den Wert "2010-12-20 00: 00: 00.0000000" ist DATETIME2 ( 7) / DT_DBTIME2 ().

Aber der verwendete Datentyp für das CYCLE_DATE-Feld ist DATETIME - DT_DATE . Das bedeutet Millisekundengenauigkeit mit einer Genauigkeit von bis zu jeder dritten Millisekunde (JJJJ-MM-TTTH: MI: ss.mmL, wobei L 0,3 oder 7 sein kann).

Die Lösung besteht darin, den Datumstyp CYCLE_DATE in DATETIME2 - DT_DBTIME2 zu ändern.

    
Bogdan Sahlean 03.09.2011 09:52
quelle