6

已经调查了一段时间,一直在碰壁。我通过 OpenRowset 命令从 xls 文件导入临时表。现在我有一个问题,我试图导入某个列有一个范围值,但最常见的是以下。列结构为长数字,即 15598,一些列为字符串,即 15598-E。

现在 openrowset 正在读取字符串版本没有问题,但将数字版本报告为 NULL。我读到(http://www.sqldts.com/254.aspx)openrowset有这个问题,作者谈到在查询字符串中实现“HDR=YES;IMEX=1”,但这对我根本不起作用。

大家有没有遇到过这种情况?

只是一些更多的信息。我可能不会使用 JET 引擎 (Microsoft.Jet.OLEDB.4.0) 执行此操作,因此我的查询如下所示:

SELECT *
FROM 
    OPENROWSET('MSDASQL'
                , 'Driver=Microsoft Excel Driver (*.xls);HDR=YES;IMEX=1;DBQ=C:\ImportFile.xls;'
            , 'SELECT * FROM [Sheet1$]')
4

5 回答 5

6

我注意到您正在使用 Excel ODBC 驱动程序。您是否尝试过具有等效连接字符串的 JET OLEDB 提供程序?

select * from openrowset(
    'Microsoft.Jet.OLEDB.4.0',
    'Data Source=C:\ImportFile.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"',
    'SELECT * FROM [Sheet1$]')

编辑:对不起,刚刚注意到你的最后一段。当然,Excel ODBC 驱动程序仍然通过 JET 引擎,那么它会有什么不同呢?

编辑:我查看了 KB194124 链接,它推荐的注册表值是我机器上的默认值,我从未更改过。我自己多次使用上述方法都没有问题。也许是环境问题?

于 2009-08-26T12:34:50.533 回答
3

如果您不介意在 Excel 中打开文件,请选择有问题的列,选择该列,然后执行

数据 -> 文本到列 -> 下一个 -> 下一个 -> 文本

保存电子表格,它们都应该在 OPENROWSET 中作为文本出现

我发现使用 .CSV 文件而不是 Excel,通过设置链接服务器打开,并在 schema.ini 中设置文件格式,这是一种更实用的处理此类导入的方法,使用该方法您可以明确选择每个列的格式。

于 2009-08-26T15:30:29.337 回答
1

我们遇到了同样的问题。不幸的是,我们也没有找到解决方案。这里有更多信息表明可能存在注册表修复。

于 2009-08-26T12:33:41.360 回答
0

我有同样的问题。我修复了它在工作表的第一行位置剪切和粘贴包含字符串/数字值(例如 123ABC)的列的行。出于某种原因,T-SQL 读取第一行并假定所有值都是数字。

于 2009-10-01T15:46:30.720 回答
0

此链接中 SqlACID 的响应效果很好 [ https://wikigurus.com/Article/Show/185717/OpenRowSet-command-in-TSQL-is-returning-NULLS]:-

如果您不介意在 Excel 中打开文件,请选择有问题的列,选择该列,然后执行

数据 -> 文本到列 -> 下一个 -> 下一个 -> 文本

保存电子表格,它们都应该在 OPENROWSET 中作为文本出现

我发现使用 .CSV 文件而不是 Excel,通过设置链接服务器打开,并在 schema.ini 中设置文件格式,这是一种更实用的处理此类导入的方法,使用该方法您可以显式选择每个列的格式。

于 2015-11-06T06:59:21.493 回答