2011-12-25 19 views
49

Ho un file excel con quattro colonne di testo: uno di questi è denominato ShortDescription che ha il valore più lungo. Ho creato una tabella nel database di SQL Server 2008, con quattro colonne e il tipo di colonna ShortDescription è impostato su NvarChar (Max).Il testo è stato troncato o uno o più caratteri non corrispondono nella tabella codici di destinazione Quando si importa dal file Excel

ma quando si utilizza la finestra di dialogo di importazione ed esportazione di SSIS, continuo ad ottenere l'errore menzionato nel titolo, anche quando ho impostato l'opzione OnTruncation su Ignora.

Ho provato a cancellare i dati della colonna e ci sono riuscito (quindi mi sono assicurato che il problema fosse nella colonna ShortDescription). Ho provato a copiare l'intero dato in un altro libro di lavoro eccellente, e ancora senza fortuna.

qualche idea ???

risposta

60

Suppongo tu stia cercando di importarlo utilizzando un'origine di Excel nella finestra di dialogo SSIS?

In tal caso, il problema è probabilmente che SSIS campiona un certo numero di righe all'inizio del foglio di calcolo quando crea l'origine Excel. Se nella colonna [ShortDescription] non si nota nulla di troppo grande, verrà impostato automaticamente su una colonna di testo di 255 caratteri.

Quindi, per importare i dati da una colonna che contiene righe con grandi quantità di dati senza troncamento, ci sono due opzioni:

  1. è necessario assicurarsi che la colonna [shortDescription] in almeno uno dei campionati righe contiene un valore superiore a 255 caratteri. Un modo per farlo è usare la funzione REPT(), ad es. = REPT ('z', 4000), che creerà una stringa di 4000 della lettera 'z'.
  2. È necessario aumentare il numero di righe campionati dal driver Jet Excel per includere una riga di questo tipo. È possibile aumentare il numero di righe campionate aumentando il valore di TypeGuessRows sotto HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel (di se il sistema è x64 quindi sotto la chiave di registro HKEY_LOCAL_MACHINE\SOFTWARE\wow6432node\Microsoft\Jet\4.0\Engines\Excel) .

È possibile visualizzare ulteriori informazioni su questi due link:

Per spiegare ulteriormente, SSIS crea 3 oggetti dietro le quinte della procedura guidata, un Excel oggetto di origine dati, un oggetto di destinazione tabella SQL e un operatore di flusso di dati tra di loro. L'oggetto di origine Excel definisce i dati di origine ed esiste indipendentemente dagli altri due oggetti. Quindi, quando viene creato, il campionamento che ho descritto viene eseguito e viene impostata la dimensione della colonna di origine. Quindi, quando l'operatore del flusso di dati esegue e tenta di estrarre i dati da Excel per inserirli nella tabella, sta già esaminando un'origine dati che è stata limitata a 255 caratteri.

+3

che è incredibilmente giusto !!! ma perché succede se la colonna di destinazione è impostata per accettare la lunghezza massima dei dati ?? quindi che lunghezza ha la colonna d'origine ??? –

+7

"Nota Per i sistemi a 64 bit, la chiave corrispondente è la seguente: ' HKLM \ SOFTWARE \ wow6432node \ microsoft \ jet \ 4.0 \ engines \ excel' "- [collegamento] (http://support.microsoft.com/ kb/281517) Ma a quanto pare il valore può essere solo fino a 16? Non sembra essere molto migliorativo, ma non l'ho testato. – PeterX

28

Ho riscontrato questo problema durante l'importazione da un file piatto delimitato in SQL Server. La soluzione era di aggiornare il valore "OutputColumnWidth" per la colonna all'origine di errore (dal messaggio di errore). Nel modulo "Scegli una fonte di dati" nella procedura guidata di importazione, la mia fonte era il file piatto. Nel riquadro più a sinistra, seleziona "Avanzate". È quindi possibile impostare le proprietà di singole colonne. Nel mio caso, "OutputColumnWidth" per la maggior parte delle mie colonne era impostato su "50". L'ho semplicemente aggiornato ad un valore più grande che non avrebbe troncato il valore dal file flat.

enter image description here

+3

In alternativa, piuttosto che indovinare un limite abbastanza grande per un DT_STR, è possibile scegliere il tipo SSIS DT_NTEXT, che è l'equivalente di MSSQL nvarchar (max) o dei tipi obsoleti di ntext. – eidgenossen

+0

Una combinazione di aggiornamento di OutputColumnWidth e di utilizzo di DataType DT_WSTR ha funzionato per me. In SQL Server 2014, DT_WSTR può avere un OutputColumnWidth fino a 4.000 caratteri Unicode di larghezza. Ciò ha comportato qualcosa di simile a 40-risposta di amore di seguito. – Jasper

+0

Puoi modificare tutte queste colonne contemporaneamente? Ho una grande quantità di colonne e mi chiedevo se fosse possibile. – Lostaunaum

5

ho ottenuto questo errore quando stavo cercando di importare un file di grandi dimensioni che ha avuto alcuni caratteri cinesi in esso, e anche alcune (grandi) le stringhe non valide.

Il file di testo è stato salvato in formato UTF8.

mie impostazioni:

sull'opzione generale (non ha cambiato nulla):

- Locale: English (United States) 
- Unicode: Unchecked 
- Code Page: 65001 (UTF-8) 

C'è un'opzione avanzata a sinistra della

- DataType (for column): Unicode String [DT_WSTR] (changed) 
- OutputColumnWidth: 4000 (that's the maximum) (changed) 

Sulla Review tipo di dati Mapping

- On Error: Ignore 
- On Truncation: Ignore 

La mia colonna obiettivo aveva larghezza = 50.

Non ho riscontrato errori con queste impostazioni.

+0

Grazie per aver postato questo. Stavo ricevendo lo stesso messaggio di errore durante le mie importazioni, causato dal problema menzionato sopra: il tentativo di importare dati con caratteri estranei in campi con tipi di dati che non accettavano caratteri stranieri. La mia correzione, a breve termine, era quella di rimuovere i caratteri stranieri dai dati che stavo cercando di importare. – cjo30080

7

Un modo semplice per farlo funzionare è modificare il file che si desidera importare e creare una nuova riga nel primo punto. In questo modo sarà sempre campionato. Quindi per tutte le colonne che possono contenere> 255 caratteri, aggiungi 255 caratteri alla cella e funzionerà. Dopo aver importato, elimina semplicemente la riga di posta indesiderata che hai aggiunto.

+2

Questa è stata la via più breve per il successo per me. –

+0

Hmmm, non sono sicuro di come questo sia diverso dalla soluzione. Questa soluzione sembra più appropriata per stackexchange. ~ (: – dcary

1

C'è una posizione alternativa del componente del Registro di sistema che deve essere modificato per risolvere questo problema.

Se non si può trovare a

Start-> Esegui-> RegEdit-> HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Excel

poi guarda in

Start-> Esegui-> RegEdit-> HKEY_LOCAL_MACHINE -> SOFTWARE -> Wow6432Node -> Microsoft -> Jet -> 4,0 -> Motori -> Excel

1

Per me questo link mi ha aiutato: https://support.microsoft.com/en-us/kb/189897

  1. Copiare la riga che ha un valore cella> 255 caratteri per l'inizio della excel, fanno si che fila la prima riga della excel
  2. variazione del valore del Registro dal link precedente.