openrowset для excel: можем ли мы пропустить несколько строк?

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

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

person Daniel Wu    schedule 08.02.2011    source источник


Ответы (2)


Используйте диапазон [лист1$A5: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]'
);
person Anon    schedule 17.01.2012
comment
Можно ли это сделать, чтобы исключить последние пять строк, где общее количество строк будет меняться каждый раз? В моей электронной таблице Excel есть текст нижнего колонтитула, который всегда начинается на одну строку после последней строки результата и длится пять строк. Но количество строк всегда будет разным. В настоящее время, если вы пытаетесь импортировать текст нижнего колонтитула, прерывается импорт, потому что он соответствует типам данных и т. д. - person TravisPUK; 26.01.2017

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

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
person Andriy M    schedule 08.02.2011
comment
это замедлит процесс ETL для выполнения row_number(). И я не уверен, может ли сервер sql загружать данные параллельно, если так, rownum не может отражать положение в файле, например, поток 1 загружает первые 100 строк, поток 2 загружает вторые 100 строк, тогда это возможно вторые 100 строк были загружены первыми в базу данных - person Daniel Wu; 09.02.2011
comment
@Daniel Wu: Итак, что у нас есть? С упорядоченным ROW_NUMBER процесс, скорее всего, замедлится, да. И неупорядоченный, скорее всего, будет назначать номера строк иначе, чем фактический порядок строк на листе Excel. И поэтому мой ответ становится почти полной ерундой в этой ситуации. Извините, похоже, у меня закончились варианты для вас на данный момент. Если бы только это: не могли бы вы пронумеровать строки в исходном документе Excel? То есть добавьте столбец со значениями, представляющими фактические номера строк, чтобы вы могли фильтровать его в SQL. - person Andriy M; 09.02.2011