2009-08-26 16 views
6

State investigando da un po 'e continuate a colpire un muro di mattoni. Sto importando da file xls in tabelle temporanee tramite il comando OpenRowset. Ora ho un problema in cui sto cercando di importare una determinata colonna con valori di intervallo, ma i più comuni sono i seguenti. Colonne strutturate come numeri lunghi, 15598 e alcune colonne come stringhe, 15598-E.Il comando OpenRowSet in TSQL restituisce NULLS

Ora l'openrowset sta leggendo la versione della stringa senza problemi ma sta segnalando la versione del numero come NULL. Ho letto (http://www.sqldts.com/254.aspx) che openrowset ha quel problema e l'autore parla dell'implementazione di "HDR = YES; IMEX = 1" nella stringa di query ma non funziona affatto per me.

Qualcuno di voi ha incontrato questo?

Solo qualche informazione in più. Non può fare questo con il motore a reazione (Microsoft.Jet.OLEDB.4.0) quindi questo è ciò che la mia interrogazione si presenta come:

SELECT * 
FROM 
    OPENROWSET('MSDASQL' 
       , 'Driver=Microsoft Excel Driver (*.xls);HDR=YES;IMEX=1;DBQ=C:\ImportFile.xls;' 
      , 'SELECT * FROM [Sheet1$]') 
+2

Ora sai perché le persone ETL odiano Excel per le importazioni! – HLGEM

risposta

6

Si noti che si sta utilizzando il driver ODBC di Excel. Hai provato il provider JET OLEDB con la stringa di connessione equivalente?

select * from openrowset(
    'Microsoft.Jet.OLEDB.4.0', 
    'Data Source=C:\ImportFile.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"', 
    'SELECT * FROM [Sheet1$]') 

EDIT: Siamo spiacenti, appena notato il tuo ultimo paragrafo. Sicuramente il driver ODBC di Excel passa ancora attraverso il motore JET, quindi che differenza farebbe?

EDIT: Ho esaminato il collegamento KB194124 e i valori di registro consigliati sono i valori predefiniti sulla mia macchina, che non ho mai modificato. Ho usato il metodo sopra più volte senza problemi. Forse è un problema ambientale?

+0

nessun problema, controlla http://stackoverflow.com/questions/1178243/che-è-la differenza- tra-odbc-and-oledb per ulteriori informazioni – StevenMcD

+0

grazie! Lo apprezzo molto! – StevenMcD

+0

+1. Un anno dopo è stato pubblicato e ho risolto lo stesso problema per me. – 8kb

1

Abbiamo riscontrato lo stesso problema. Purtroppo non abbiamo ancora trovato una soluzione. C'è più informazioni here che indica che potrebbe esserci una correzione del registro.

+0

cool, grazie per il link – StevenMcD

2

Se non ti dispiace aprire il file in Excel, prendere le colonne che hanno il problema, selezionare la colonna, e fare

Dati -> Testo in colonne -> Avanti -> Avanti -> Testo

Salvare il foglio di calcolo e tutti devono entrare come testo in OPENROWSET

ho trovato utilizzando i file invece di Excel, aperte attraverso la creazione di un server collegato, e impostare il formato dei file CSV in schema.ini un approccio più pratico per gestire le importazioni come questa, con quel metodo puoi esplici scegli il formato di ogni colonna.

0

Ho avuto lo stesso problema. L'ho risolto tagliando e incollando una riga che contiene una colonna con la stringa/valore numerico (ad esempio 123ABC) nella prima riga del foglio. Per qualche ragione, T-SQL legge la prima riga e assume che tutti i valori siano numerici.

0

risposta da SqlACID in questo link funzionato grande [https://wikigurus.com/Article/Show/185717/OpenRowSet-command-in-TSQL-is-returning-NULLS]: -

Se non ti dispiace aprire il file in Excel, prendere le colonne che hanno il problema, selezionare la colonna, e fare

dati -> Testo in colonne -> Avanti -> Avanti -> Testo

Salvare il foglio di calcolo e tutti devono entrare come testo in OPENROWSET

ho trovato usando file invece di Excel CSV, aperto da configurare un server collegato, e impostando il formato dei file in schema.ini un approccio più pratico per gestire le importazioni come questa, con quel metodo puoi scegliere esplicitamente il formato di ogni colonna.

Problemi correlati