OpenRowset Excel读取顺序

我正在使用MS SQL 2012读取Excel工作表(Excel 2010)。 Excel工作表可能具有可变数量的列和可变模式,其范围可以从一百到几千。 我需要读取每个logging到一个临时表,然后正常化。 我从此开始使用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”的限制。 所以当我有大量的列(> 255)excel文件,这种方法失败。 除了加载之外,单个表中的列可能会造成另一个超过表格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表格,创build几个临时表格,这些表格放在一起会给我所有的列。 把这些临时表放在一起得到一个完整的logging,我打算使用一个联接,也许是一个视图,这里是我偶然发现的一个问题。

  • OpenRowset是否会维护读取顺序,使得在Excel中logging一个logging将在所创build的所有临时表中logging为1,其他logging则如此logging?
  • 如果维护顺序,我可以简单地joinSQL行号,如果不是我应该怎么做呢?

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

表中没有行的“顺序”的真正概念。 除非向select添加ORDER BY子句,否则不能保证任何select将显示结果。

也就是说,如果没有ORDER BY,一个简单的select通常会将这些行重新添加到它们的顺序中,但是有太多事情要做,所以无法保证。

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