2011-02-08 46 views
11

Utilizaré el siguiente sql para leer los datos de Excel, pero a veces necesito saltear varias filas. Por ejemplo, los datos reales comienzan en la línea 5, así que debo omitir las primeras 4 filas, ¿es eso factible?openrowset para excel: ¿podemos omitir varias filas?

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

Respuesta

5

Esto número se obtienen las filas, sin orden específico (La Chispa de la Vida):

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; 

es posible que desee especificar un poco de orden, si lo considera oportuno, cambiando el rownum definición así:

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

que ralentizará el proceso de ETL para hacer row_number(). Y no estoy seguro de si el servidor sql puede cargar los datos en paralelo, si es así, el rownum no puede reflejar la posición en el archivo, como el hilo 1 carga las primeras 100 filas, el hilo 2 carga las otras 100 filas, entonces es posible las primeras 100 filas se cargaron primero en la base de datos –

+0

@Daniel Wu: Entonces, ¿qué tenemos? Con un ROW_NUMBER ordenado, es muy probable que el proceso se ralentice, sí. Y el desordenado es muy probable que asigne números de fila de manera diferente al orden real de las filas en la hoja de Excel. Y entonces mi respuesta se vuelve casi completamente basura en esta situación. Lo siento, parece que me he quedado sin opciones para ti por el momento. Si solo esto: ¿podría numerar las filas en el documento original de Excel? Es decir, agregue una columna con valores que representen los números de filas reales, de modo que pueda filtrar en SQL. –

16

utilizar un intervalo [sheet1 $ A5: Z] en lugar de toda la hoja [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

¿Se puede hacer esto para excluir las últimas cinco filas donde el número total de filas cambiará cada vez? Mi hoja de cálculo de Excel tiene texto de pie de página que siempre comienza una fila después de la última fila de resultados y va por cinco filas. Pero el número de filas siempre será diferente. Actualmente, si intenta importar el texto del pie de página, se rompe la importación porque se ajusta a los tipos de datos, etc. – TravisPUK