OpenRowset Excel读取订单

时间:2015-05-07 08:13:43

标签: sql-server excel openrowset

我正在使用MS SQL 2012来阅读Excel工作表(excel 2010)。 excel表可以具有可变数量的列和可变模式,其可以从一百到一千以上。我需要将每条记录读入临时表,然后将其标准化。我开始使用OpenRowset来实现这个

> Insert into #temp FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
>     'Excel 12.0;HDR=YES;Database=c:\dir\test.xlsx',
>     'SELECT * FROM [sheet1$]');

我很快意识到这种方法允许我一次读取的最大列数为255.一些快速研究表明这是驱动程序的限制' Microsoft.ACE.OLEDB.12.0&# 39 ;.因此,当我有excel大量列(> 255)的文件时,这种方法失败了。除了加载之外,单个表中的列可能会造成超出表的8060页大小限制的另一个问题。所以我改变了我的方法并决定进行多次读取并循环openrowset命令,以便一次读取200列并将其加载到临时表。我可以通过将excel列范围附加到工作表名称 [sheet1 $ A:GR] 来指定范围,命令看起来像

> Insert into #temp01 FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
>     'Excel 12.0;HDR=YES;Database=c:\dir\test.xlsx',
>     'SELECT * FROM [sheet1$A:GR]');

一旦我把它放在正确的循环中,我就能够读取整个excel表并创建几个临时表,当它们放在一起时会给我所有的列。要将这些临时表放在一起以获得一个完整的记录,我打算使用Join和一个视图,这里我偶然发现了一个问题。

  • OpenRowset是否会保持读取顺序,以便在excel中记录一个 将在我创建的所有临时表中记录1,等等 记录?
  • 如果维护订单,我可以简单地加入SQL行号, 如果不是我应该怎么做呢?

感谢这方面的任何帮助/建议。

1 个答案:

答案 0 :(得分:1)

表中没有关于行'顺序'的真实概念。除非您向选择中添加ORDER BY子句,否则不能保证任何选择将显示结果的顺序。

那就是说,如果没有ORDER BY,一个简单的选择将通常按照添加的顺序返回行,但是有很多事情要进入保证方式。

最好的办法是在每个临时表中添加一个int列,例如行。将源数据的Excel行号放入其中,然后您可以识别每个数据位来自的行,并使用源excel行匹配临时表中的数据。