使用Openrowset导入Excel文件时,我们是否可以跳过几行?

13

我将使用以下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$]');
2个回答

19

使用区域 [sheet1$A5:Z] 而不是整个工作表 [sheet1$]

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

这个能否实现排除最后五行,而每次总行数都会改变?我的Excel电子表格有页脚文本,它总是从最后一个结果行的下一行开始,并延续五行。但行数总是不同的。目前,如果您尝试导入页脚文本,它会破坏导入,因为它不符合数据类型等要求。 - TravisPUK

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 <i>specific_column_list</i>) AS rownum

这会减慢ETL过程以执行row_number()。我不确定SQL Server是否可以并行加载数据,如果可以,则rownum无法反映文件中的位置,例如线程1加载前100行,线程2加载第二个100行,那么第二个100行可能首先被加载到数据库中。 - Daniel Wu
@Daniel Wu:那我们有什么办法呢?使用有序的ROW_NUMBER很可能会导致进程变慢,而无序的ROW_NUMBER很可能会将行号分配给Excel表格中实际顺序不同的行。因此,在这种情况下,我的答案几乎完全是垃圾。很抱歉,看来我暂时为您没有更多的选择。如果只有这样:您是否可以在原始Excel文档中对行进行编号?也就是说,添加一个包含表示实际行号的值的列,以便您可以在SQL中进行过滤。 - Andriy M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接