SQL中的OpenRowSet命令返回NULLS

时间:2009-08-26 12:26:31

标签: tsql excel import-from-excel openrowset

现在正在调查一段时间并继续撞砖墙。我通过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$]')

5 个答案:

答案 0 :(得分:6)

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

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链接,它推荐的注册表值是我机器上的默认值,我从未更改过。我自己多次使用上述方法没有问题。也许这是一个环境问题?

答案 1 :(得分:2)

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

数据 - >文字到列 - >下一步 - >下一步 - >文本

保存电子表格,它们都应该作为OPENROWSET中的文本进入

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

数据 - >文字到列 - >下一步 - >下一步 - >文本

保存电子表格,它们都应该作为OPENROWSET中的文本进入

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