现在正在调查一段时间并继续撞砖墙。我通过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$]')
答案 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中设置文件格式是一种更实用的方法来处理这样的导入,用这种方法就可以了明确选择每个列的格式。