2011-02-08 2 views
11

Я буду использовать следующий sql для чтения данных из excel, но иногда мне нужно пропустить первые несколько строк. например, реальные данные начинаются с строки 5, поэтому мне нужно пропустить первые 4 строки, это выполнимо?openrowset для excel: можем ли мы пропустить несколько строк?

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

ответ

5

Это номер строки быть получены без конкретного заказа (как назло):

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; 

Вы можете указать какой-то порядок, если вы посчитаете нужным, путем изменения rownum определение следующим образом:

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

, что замедлит процесс ETL для выполнения row_number(). И я не уверен, может ли sql-сервер загружать данные параллельно, если так rownum не может отразить позицию в файле, например, поток 1 загружает первые 100 строк, поток 2 загружает второй 100 строк, тогда это возможно первые 100 строк были загружены сначала в базу данных –

+0

@ Даниэль Ву: Итак, что у нас получилось? При заказе ROW_NUMBER процесс, скорее всего, замедляется, да. И неупорядоченный, скорее всего, присвоит номера строк по-разному от фактического порядка строк на листе excel. И поэтому мой ответ становится почти полностью мусором в этой ситуации. Извините, похоже, у меня пока что нет вариантов. Если бы это было: вы могли бы указать числа в оригинальном документе excel? То есть, добавьте столбец со значениями, представляющими фактические номера строк, чтобы вы могли фильтровать его в SQL. –

16

использовать диапазон [лист1 $ А5: Z] вместо того, чтобы весь лист [лист1 $]

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

Можно ли это сделать, чтобы исключить последние пять строк, где общее количество строк будет меняться каждый раз? В моей электронной таблице Excel есть текст нижнего колонтитула, который всегда начинается с одной строки после последней строки результата и идет на пять строк. Но количество строк всегда будет отличаться. В настоящее время, если вы пытаетесь импортировать текст нижнего колонтитула, он прерывает импорт, поскольку он соответствует типам данных и т. Д. – TravisPUK