将 Excel 2010 导入 SQL Server
Posted
技术标签:
【中文标题】将 Excel 2010 导入 SQL Server【英文标题】:Import Excel 2010 into SQL Server 【发布时间】:2013-03-15 04:55:27 【问题描述】:我使用 Excel 收集和配置数据,然后将其导入 SQL Server 2012 进行存储。
到目前为止,我一直在使用 SQL Server 导入和导出向导,但是经常手动设置它很痛苦。由于我使用的是 Express,当然它不允许我保存甚至查看传输数据的实际命令。
我尝试按照How to use Excel with SQL Server linked servers and distributed queries 设置链接服务器,但收到以下错误:
已创建链接服务器,但连接测试失败。您要保留链接服务器吗?
执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)
无法为链接服务器“FLTST”初始化 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”的数据源对象。 链接服务器“FLTST”的 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”返回消息“未指定错误”。 (Microsoft SQL Server,错误:7303)
我认为可能是 Excel 版本号有问题,因为网页是 2005 年的,所以我尝试了:
页面显示的 Excel 8.0 (Excel 2002) 向导似乎使用的是 Excel 12.0 (Excel 2007) Excel 14.0 (Excel 2010) 我实际拥有的东西所有这些都给了我相同的结果。
接下来我尝试了 分布式查询,如 Import excel file to SQL Server Express 所示,(同样使用不同的提供程序字符串变体)
USE ExTest
SELECT * INTO TstTbl FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 14.0;Database=c:\ExTest.xlsm', [Contacts])
go
这给了我以下错误:
链接服务器“(null)”的 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”返回消息“未指定的错误”。 消息 7303,第 16 层,状态 1,第 3 行 无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”的数据源对象。
我应该留在 Excel 中并将其推送过来,而不是转到 SQL Server 并拉入数据?
我做错了什么?
PS:请不要告诉我将其转换为 csv 文件!我正在尝试更少步骤,而不是更多!
【问题讨论】:
“不断手动设置它很痛苦”。这是因为您的 Excel 字段发生了变化,还是因为您不喜欢通过向导?您应该能够保存包并在下次重新运行它......我认为 - 不是 100% 确定 SQL Express。 在您的情况下,我可能只是编写一个小的 C# 应用程序,它读取 Excel 并从中获取所需的数据,然后将这些行插入 SQL Server。众所周知,“Jet OleDB”驱动程序很难使用——尤其是在 64 位服务器操作系统上——所以我会尽可能避免使用这些驱动程序 如果你的excel文件架构没有变化,只是文件名在变化,那么你可以尝试设置一个动态源的SSIS包来解决你的问题,你不需要经过每次都使用向导,每次更改源时只需更新 SSIS 配置。 【参考方案1】:遇到与您的问题类似的问题,我对此进行了一些研究。我的问题还没有完全解决,但我想我可能会让你更进一步。虽然这个问题很老,但也许还有其他人需要帮助。
通过运行:
SELECT *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml;HDR=YES;Database=P:\Path\File.xlsx','SELECT * FROM [Sheet1$]');
GO
我收到以下错误消息:
消息 15281,第 16 级,状态 1,第 19 行 SQL Server 阻止了对组件“即席分布式查询”的声明“OpenRowset/OpenDatasource”的访问,因为该组件作为该服务器安全配置的一部分被关闭。系统管理员可以使用 sp_configure 启用“即席分布式查询”。有关启用“即席分布式查询”的详细信息,请在 SQL Server 联机丛书中搜索“即席分布式查询”。
为了解决这个问题,我运行以下命令:
sp_configure 'show advanced options', 1
RECONFIGURE
GO
sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO
但我收到一条新的错误消息:
消息 7302,第 16 级,状态 1,第 19 行 无法为链接服务器“(null)”创建 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的实例。
纠正我跑了:
EXEC sp_MSSet_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
GO
EXEC sp_MSSet_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
GO
但我得到了这个错误:
消息 7438,第 16 级,状态 1,第 19 行 32 位 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”无法在 64 位 SQL Server 的进程中加载。
就我而言,我已要求 IT 部门在服务器上安装 64 位版本的 excel,我希望这应该是从 excel 导入时出现的技术问题的结束。
为了事后清理,我禁用了我刚刚启用的设置:
EXEC sp_MSSet_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 0
GO
EXEC sp_MSSet_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 0
GO
sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO
sp_configure 'show advanced options', 0
RECONFIGURE
GO
【讨论】:
【参考方案2】:-
使用 Excel 数据源连接管理器创建 SSIS 包,目标是您的 SQL express,OLE DB 目标
创建 Excel 连接管理器时,可以只使用一个现有的 excel 文件
定义一个用户变量,如user::sourceFile,用于输入excel文件全路径
创建Excel连接管理器后,右键->preperties->找到“Expression”,把你的[User::sourceFile]给Expression
只需创建一个从源到目标的简单数据流
保存并调试您的 SSIS 包,确保所有凭据都有效并且数据可以流入目标表。注意:不要将敏感数据保存在使用机器密钥加密的包中
每次需要加载新文件时,使用DTEXEC执行打包并覆盖参数
祝你好运
【讨论】:
我没有忘记你,我只是没有时间使用你的解决方案来尝试让它发挥作用:(以上是关于将 Excel 2010 导入 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章
将 Excel 电子表格列导入 SQL Server 数据库