【发布时间】:2015-07-17 16:36:39
【问题描述】:
我正在使用 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”的限制。因此,当我有包含大量列(> 255)的 excel 文件时,这种方法会失败。除了在单个表中加载 so may 列之外,还会带来另一个问题,即超过表的 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 行号, 如果不是,我应该怎么做?
感谢您在这方面的任何帮助/建议。
【问题讨论】:
标签: sql-server excel openrowset