【问题标题】:OpenRowset Excel read orderOpenRowset Excel 读取顺序
【发布时间】: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


    【解决方案1】:

    表中的行的“顺序”没有真正的概念。不能保证任何选择将呈现结果的顺序,除非您在选择中添加 ORDER BY 子句。

    也就是说,如果没有 ORDER BY,一个简单的选择通常会按照添加的顺序将行带回,但是有太多的事情要做,所以它没有方式有保证。

    最好的办法是为您的每个临时表添加一个 int 列,例如排。将源数据的Excel行号放入其中,即可识别出每一位数据的来源行,并将临时表中的数据与源excel行匹配。

    【讨论】:

    • 我可以轻松地将标识列添加到临时表中,这将为我提供可用于创建连接的行号。我的问题仍然存在 openrowset 是否按照列在 Excel 中的顺序写入数据库
    • 鉴于 excel 文件的物理限制,读取将按行顺序进行,因此从某种意义上说,写入也是如此。请注意,在提交发生之前,实际上可能没有实际写入任何内容。但是,在关系数据库中,如果没有 order by 子句,则无法保证 select 的顺序。套用我的答案,答案是有时它会按书面顺序阅读它们,但并非总是如此,你不能保证什么时候。
    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多