it-swarm.com.de

Wie korrigiere ich den 'Ungültigen Zeichenwert für die Besetzungsspezifikation' für eine Datumsspalte in einer Einfachdatei?

Ich habe eine CSV-Datei mit einer {LF}, die 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 Datum (nicht Datumszeit).

In meinem Flat File Connection Manager habe ich die Datumsspalte als Datentypdate [DT_DATE]konfiguriert, wobei TextQualified auf true und der Spaltenbegrenzer als{LF}gesetzt wurde (dies ist die letzte Spalte in jeder Zeile). Ich habe das Textqualifikationsmerkmal auf"gesetzt.

Wenn ich versuche, dies in ein OLE -Ziel zu laden, erhalte ich die folgende Fehlermeldung

[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" Ergebnis: 0x80004005 Beschreibung: "Ungültiger Zeichenwert für die Cast-Spezifikation." . [TRN_DORPS [760]] Fehler: Bei der Eingabespalte "" CYCLE_DATE "" (874) ist am Eingang "OLE DB Destination Input" (773) ein Fehler aufgetreten. Der zurückgegebene Spaltenstatus war: "Der Wert konnte wegen eines potenziellen Datenverlusts nicht konvertiert werden.".

Wenn ich einen Daten-Viewer anhebe, lautet der Wert in der Pipeline 2010-12-20 00:00:00.0000000. Ist dies die Zeitkomponente, die das Problem verursacht? Ich versuche, die Zeitkomponente mit (DT_DATE)(DT_DBDATE)[CYCLE_DATE] zu entfernen, aber es hat keinen Erfolg, da sie in der Pipeline gleich bleibt

9
manning18

Ich konnte die Lösung letztendlich auflösen, indem ich den Spaltentyp in der Flat File-Verbindung auf den Typ "Datenbankdatum [DT_DBDATE]" setzte.

Anscheinend 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 Zeitstempelstruktur, die aus Jahr, Monat, Stunde, Minute, Sekunde und Bruch besteht

Durch die Änderung des Spaltentyps in DT_DBDATE wurde das Problem behoben. Ich habe einen Daten-Viewer angehängt, und der Wert CYCLE_DATE war jetzt einfach "20.12.2010" ohne Zeitkomponente, was das Problem offenbar behoben hat.

17
manning18

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 gezogen habe. Dieses Beispiel bietet keine Lösung, es kann jedoch hilfreich sein, um herauszufinden, wo das Problem in Ihrem Fall liegen könnte.

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

Orders file

Eine einfache Tabelle mit dem Namen dbo.Destination in der SQL Server-Datenbank wurde erstellt, um die CSV-Dateidaten mithilfe des SSIS-Pakets aufzufüllen. Das Skript für die Tabelle erstellen ist unten angegeben.

CREATE TABLE [dbo].[Destination](
    [OrderNumber] [varchar](50) NULL,
    [OrderDate] [date] NULL
) ON [PRIMARY]
GO

Im SSIS-Paket habe ich zwei Verbindungsmanager erstellt. SQLServer wurde mit der DB-Verbindung OLE erstellt, um eine Verbindung zur SQL Server-Datenbank herzustellen. FlatFile ist ein Flat-File-Verbindungsmanager.

Connections

Der Flat File-Verbindungsmanager wurde zum Lesen der CSV-Datei konfiguriert. Die Einstellungen sind unten dargestellt. Die roten Pfeile zeigen die vorgenommenen Änderungen an. 

Name des Flat-File-Verbindungsmanagers angegeben. Durchsucht den Speicherort der CSV-Datei und wählt den Dateipfad aus. Geben Sie das doppelte Anführungszeichen (") als Textqualifizierer ein. Das Zeilenbegrenzer der Kopfzeile wurde von {CR} {LF} in {LF} geändert. Diese Kopfzeilen-Begrenzungsänderung wird auch im Abschnitt "Spalten" berücksichtigt.

Flat File General

Im Abschnitt "Spalten" wurden keine Änderungen vorgenommen.

Flat File Columns

Der Spaltenname wurde von Spalte0 in OrderNumber geändert.

Advanced column OrderNumber

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

Advanced column OrderDate

Die Vorschau der Daten im Flat File-Verbindungsmanager sieht gut aus.

Data Preview

Platzieren Sie auf der Registerkarte Control Flow des SSIS-Pakets einen Data Flow Task.

Control Flow

Platzierte in der Datenflusstask einen Flat File Source und einen OLE DB Destination.

Data Flow Task

Flat File Source wurde konfiguriert, um die CSV-Dateidaten mit dem FlatFile-Verbindungsmanager zu lesen. Nachfolgend sind drei Screenshots dargestellt, wie die Flat-File-Quellkomponente konfiguriert wurde.

Flat File Source Connection Manager

Flat File Source Columns

Flat File Source Error Output

Die OLE DB Destination-Komponente wurde so konfiguriert, dass sie die Daten von Flat File Source akzeptiert und in die SQL Server-Datenbanktabelle mit dem Namen dbo.Destination einfügt. Nachfolgend drei Screenshots zeigen, wie die DB-Zielkomponente OLE konfiguriert wurde.

OLE DB Destination Connection Manager

OLE DB Destination Mappings

OLE DB Destination Error Output

Mit den in den folgenden fünf Screenshots genannten Schritten fügte ich einen Daten-Viewer für den Fluss zwischen der Flat File Source und dem DB-Ziel OLE hinzu.

Right click

Data Flow Path Editor New

Configure Data Viewer

Data Flow Path Editor Added

Data Viewer visible

Vor dem Ausführen des Pakets habe ich die ursprünglichen Daten in der Tabelle überprüft. Es ist derzeit leer, da ich dies mit dem am Anfang dieses Beitrags bereitgestellten Skript erstellt habe.

Empty Table

Das Paket wurde ausgeführt, und die Paketausführung wurde vorübergehend angehalten, um die Daten anzuzeigen, die von der Flat File Source zum DB-Ziel OLE im Daten-Viewer fließen. Ich habe auf die Ausführen-Schaltfläche geklickt, um mit der Ausführung fortzufahren.

Data Viewer Pause

Das Paket wurde erfolgreich ausgeführt.

Successful execution

Flat-File-Quelldaten wurden erfolgreich in die Tabelle dbo.Destination eingefügt.

Data in table

Hier ist das Layout der Tabelle dbo.Destination. Wie Sie sehen, ist das Feld OrderDate vom Datentyp date und das Paket fügt die Daten weiterhin korrekt ein.

Destination layout

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

39
user756519

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

Der verwendete Datentyp für das Feld CYCLE_DATE ist jedoch DATETIME - DT_DATE . Dies bedeutet Millisekundengenauigkeit mit Genauigkeit bis zu jeder dritten Millisekunde (JJJJJ-mm-TTThh: 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.

0
Bogdan Sahlean