2011-02-08 9 views
11

Userò il seguente sql per leggere i dati da Excel, ma a volte ho bisogno di saltare prima diverse righe. ad esempio, i dati reali iniziano dalla riga 5, quindi ho bisogno di saltare le prime 4 righe, è fattibile?openrowset per Excel: possiamo saltare più righe?

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=YES;Database=c:\daniel\test.xls', 
    'SELECT * FROM [sheet1$]'); 

risposta

5

Ciò numerare le righe essere ottenuti, senza alcun ordine specifico (come la fortuna l'avrebbe):

SELECT * 
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rownum 
    FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=YES;Database=c:\daniel\test.xls', 
    'SELECT * FROM [sheet1$]') 
) s 
WHERE rownum > 4; 

si consiglia di specificare un certo ordine, se si vede in forma, modificando il rownum definizione in questo modo:

ROW_NUMBER() OVER (ORDER BY specific_column_list) AS rownum 
+0

che rallenterà il processo ETL per eseguire row_number(). E non sono sicuro che il server sql possa caricare i dati in parallelo, in tal caso il rownum non può riflettere la posizione nel file, ad esempio thread 1 carica le prime 100 righe, thread 2 carica le seconde 100 righe, quindi è possibile le seconde 100 righe sono state caricate prima nel database –

+0

@Daniel Wu: Allora, cosa abbiamo? Con un ROW_NUMBER ordinato, è molto probabile che il processo rallenti, sì. E quello non ordinato è molto probabile che assegni i numeri di riga in modo diverso dall'ordine effettivo delle righe nel foglio excel. E così la mia risposta diventa quasi completamente spazzatura in questa situazione. Scusa, sembra che per il momento non abbia più opzioni per te. Se solo questo: potresti eventualmente numerare le righe nel documento excel originale? Cioè, aggiungi una colonna con valori che rappresentano i numeri di riga effettivi, in modo da poterli filtrare in SQL. –

16

Utilizzare una gamma [foglio1 $ A5: Z] anziché l'intero foglio di [$ Sheet1]

SELECT * 
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=YES;Database=c:\daniel\test.xls', 
    'SELECT * FROM [sheet1$A5:Z]' 
); 
+0

Può essere fatto per escludere le ultime cinque righe in cui il numero totale di righe cambierà ogni volta? Il foglio di calcolo Excel ha un testo piè di pagina che inizia sempre una riga dopo l'ultima riga del risultato e va per cinque righe. Ma il numero di file sarà sempre diverso. Attualmente se si tenta di importare il testo del piè di pagina si interrompe l'importazione perché è conforme ai tipi di dati, ecc. – TravisPUK