我正在使用MS 2012来读取Excel表格(excel 2010)。excel工作表可能有可变的列数和可变架构,其范围从100到1000多个不等。我需要将每条记录读入临时表,然后将其规范化。我从使用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列范围附加到工作表名 sheet 1$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表,并创建几个临时表,这些表放在一起将给出所有列。为了将这些临时表放在一起以获得一个完整的记录,我打算使用一个连接,也许是一个视图,这里是我遇到问题的地方。
感谢在这方面的任何帮助/建议。
发布于 2015-05-07 11:51:34
表中的行的“顺序”没有真正的概念。除非在select中添加order子句,否则不能保证select将显示结果。
也就是说,如果没有ORDER,简单的select通常会使行按照它们被添加的顺序返回,但是有太多的事情要做,所以根本无法保证。
最好的方法是在每个临时表中添加一个int列,称为例如Row。将源数据的Excel行号放入其中,然后可以识别每一位数据来自的行,并将跨临时表的数据与源excel行相匹配。
https://stackoverflow.com/questions/30095410
复制相似问题