2011-02-08 52 views
11

我将使用以下sql从excel中读取数据,但有时我需要跳过前几行。例如真正的数据从第5行开始,所以我需要跳过前4行,这是可行的吗?excel的openrowset:我们可以跳过几行吗?

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 server是否可以并行加载数据,如果是这样的话,rownum不能反映文件中的位置,比如线程1加载前100行,线程2加载第100行,那么这是可能的第二百行被首先装入数据库 – 2011-02-08 23:39:44

+0

@Daniel Wu:那么我们得到了什么?有了订购的ROW_NUMBER,这个过程很可能会放慢,是的。而无序的很可能会分配行号不同于Excel表中的行的实际顺序。所以我的回答在这种情况下几乎变成了垃圾。对不起,我似乎暂时没有选择。如果只有这样的话:你可能可以在原始Excel文档中对行进行编号吗?也就是说,添加一个包含表示实际行号的值的列,以便在SQL中筛选它。 – 2011-02-09 00:05:30

16

使用的范围内[表Sheet 1 $ A5:Z],而不是整个板[表Sheet 1 $]

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