2011-09-02 40 views
7

Ho un file CSV con un {LF} delimitando ogni riga e una colonna di data con il formato della data come "12/20/2010" (comprese le virgolette)Come posso risolvere "Valore carattere non valido per specifica cast" su una colonna data in un file flat?

La mia colonna di destinazione è una tabella di database di SQL Server 2008 di tipo data (non datetime)

nel mio appartamento Connection File manager, ho configurato la colonna della data di essere il tipo di dati date [DT_DATE] con TextQualified impostata su true e il delimitatore di colonna come {LF} (è l'ultima colonna su ogni riga). Ho il set qualificatore di testo per "

Quando provo a caricare questo in una destinazione OLE ottengo il seguente errore

[TRN_DORPS [760]] Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005. An OLE DB record is available. Source: "Microsoft OLE DB Provider for SQL Server" Hresult: 0x80004005 Description: "Invalid character value for cast specification.". [TRN_DORPS [760]] Error: There was an error with input column ""CYCLE_DATE"" (874) on input "OLE DB Destination Input" (773). The column status returned was: "The value could not be converted because of a potential loss of data.".

Se io attribuisco un visualizzatore di dati, il valore in cantiere è 2010-12-20 00:00:00.0000000 - è questo componente orario che cosa sta causando il problema? Provo a nudo fuori la componente temporale con (DT_DATE)(DT_DBDATE)[CYCLE_DATE] ma inutilmente in quanto rimane lo stesso in cantiere

+2

@Siva - ottima risposta all'altra domanda – JNK

risposta

17

sono stato in ultima analisi, in grado di risolvere la soluzione impostando il tipo di colonna nella connessione file flat ad essere di tipo "data di database [DT_DBDATE]"

A quanto pare le differenze tra questi formati di data sono i seguenti:

DT_DATE Una struttura di data che comprende anno, mese, giorno, e ora.

DT_DBDATE Una struttura di data che è composta da anno, mese e giorno.

DT_DBTIMESTAMP Una struttura timestamp che si compone di anno, mese, ora, minuti, secondi, e la frazione

Cambiando il tipo di colonna per DT_DBDATE il problema è stato risolto - Ho attaccato un visualizzatore di dati e il valore CYCLE_DATE era ora semplicemente "20/12/2010" senza un componente orario, che apparentemente ha risolto il problema.

+0

+ 1 - Anche se questo non era il mio problema esatto, era ancora molto informativo. –

0

Il tipo di dati corretto per "2010-12-20 00: 00: 00,0000000" valore è DATETIME2(7)/DT_DBTIME2() .

Ma il tipo di dati utilizzato per il campo CYCLE_DATE è DATETIME - DT_DATE. Ciò significa precisione millisecondi con precisione fino al terzo millisecondo (aaaa-mm-ggThh: mi: ss.mmL dove L può essere 0,3 o 7).

La soluzione è di modificare il tipo di data CYCLE_DATE su DATETIME2 - DT_DBTIME2.

+0

Penso che il vero problema sia il formato utilizzato per il valore della data.Questo formato include le virgolette: '" MM/gg/aaaa "'. Quindi, SSIS tenta di convertire il valore "" 12/20/2010 "' (anziché '12/20/2010') al tipo di dati' date [time] '(e fallisce). Le virgolette sono (più o meno) delimitatori standard per valori stringa/testo. Manning18 tenta di rimuovere le virgolette dai valori di data. –

+0

Non importa. Il problema è lo stesso. L'origine dati può considerare il valore "" 12/20/2010 "' come 'DT_STR' (tipo di dati stringa). Se il campo di destinazione CYCLE_DATE ha il tipo di dati DATE [TIME], l'errore di conversione verrà generato al passaggio finale. –

+0

Puoi dirmi quale errore verrà generato (e quando) se (1) in 'Sorgente file flat' il campo 'CYCLE_DATE' ha il tipo di dati' DT_DATE', (2) la Sorgente file flat non ha un qualificatore di testo ma (3) in "Uscita origine file flat -> Colonne di output" il campo 'CYCLE_DATE' ha il tipo di dati' DT_STR'? Oppure, se l'origine file flat ha qualificatore di testo (") ma il campo' CYCLE_DATE' (dal file di testo) ha alcuni valori non validi (ad esempio "12" insted di "12/20/2010")? –

34

Per simulare il problema che si sta affrontando, ho creato il seguente esempio utilizzando SSIS 2008 R2 con il backend SQL Server 2008 R2. L'esempio è basato su ciò che ho raccolto dalla tua domanda. Questo esempio non fornisce una soluzione, ma potrebbe aiutarti a identificare dove potrebbe essere il problema nel tuo caso.

Creato un semplice file CSV con due colonne, ovvero il numero dell'ordine e la data dell'ordine. Come hai menzionato nella tua domanda, i valori di entrambe le colonne sono qualificati con virgolette (") e anche le linee terminano con Avanzamento riga (\ n) con la data dell'ultima colonna. Lo screenshot sottostante è stato preso usando Notepad++, che in grado di visualizzare i caratteri speciali in un file. LF nello screenshot denota Line feed.

Orders file

creato una semplice tabella di nome dbo.Destination nel database di SQL Server per popolare i dati del file CSV utilizzando il pacchetto SSIS. Creare copione per la tabella è riportata di seguito:

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

Nel pacchetto SSIS, ho creato due gestori connessioni. SQLServer è stato creato utilizzando la connessione OLE DB per connettersi al database SQL Server. FlatFile è un gestore di connessione file flat.

Connections

Lima piatta gestione connessione è stato configurato per leggere il file CSV e le impostazioni sono riportati di seguito.Le frecce rosse indicano le modifiche apportate.

Fornito un nome per il gestore di connessione file flat. Passato alla posizione del file CSV e selezionato il percorso del file. Inserito il doppio preventivo (") come qualificatore di testo. Modificato il delimitatore riga intestazione da {CR} {LF} a {LF}. Questa modifica del delimitatore di righe di intestazione si riflette anche nella sezione Colonne.

Flat File General

Non sono state apportate nella sezione Colonne.

Flat File Columns

cambiato il nome della colonna da Column0-OrderNumber.

Advanced column OrderNumber

cambiato il nome della colonna da Column1-OrderDate e cambiato anche il tipo di dati per date [DT_DATE]

Advanced column OrderDate

Anteprima dei dati all'interno della connessione file flat direttore sembra buono.

Data Preview

Nella scheda Control Flow del pacchetto SSIS, posto un Data Flow Task.

Control Flow

All'interno del Flusso di dati, posto un Flat File Source ed un OLE DB Destination.

Data Flow Task

Il Flat File Source è stato configurato per leggere i dati del file CSV utilizzando la gestione connessione FlatFile. Sotto tre schermate viene mostrato come è stato configurato il componente di origine file flat.

Flat File Source Connection Manager

Flat File Source Columns

Flat File Source Error Output

Il OLE DB Destination componente è stato configurato per accettare i dati del piatto di origine file e inserirlo nella tabella del database SQL Server denominata dbo.Destination. Sotto tre schermate viene mostrato come è stato configurato il componente Destinazione OLE DB.

OLE DB Destination Connection Manager

OLE DB Destination Mappings

OLE DB Destination Error Output

Utilizzando i passaggi riportati nel sotto 5 screenshot, ho aggiunto un visualizzatore di dati sul flusso tra l'origine file flat e Destinazione OLE DB.

Right click

Data Flow Path Editor New

Configure Data Viewer

Data Flow Path Editor Added

Data Viewer visible

Prima di eseguire il pacchetto, ho verificato i dati iniziali presenti nella tabella. Al momento è vuoto perché l'ho creato utilizzando lo script fornito all'inizio di questo post.

Empty Table

eseguito il pacchetto e l'esecuzione del pacchetto temporaneamente in pausa per visualizzare i dati che fluiscono da Flat Fonte File per OLE DB destinazione nel visualizzatore di dati. Ho fatto clic sul pulsante Esegui per procedere con l'esecuzione.

Data Viewer Pause

Il pacchetto eseguito con successo.

Successful execution

dati di origine di file flat è stato inserito con successo nella tabella dbo.Destination.

Data in table

Ecco il layout della dbo.Destination tavolo. Come si può vedere, il campo OrderDate è del tipo di dati data e il pacchetto continua a inserire correttamente i dati.

Destination layout

Questo post anche se non è una soluzione. Si spera che ti aiuti a scoprire dove potrebbe essere il problema nel tuo scenario.

+9

Sono stupito che non hai creato un account registrato o perché il tuo nome è oscurato? Risposta meravigliosa +1 –

+3

Oh, e grazie per avermi insegnato a proposito di * Visualizzatori di dati *. Mi hai appena salvato da centinaia di ore di lavoro –