将 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 数据库

将csv文件/excel导入sql数据库asp.net

SQL Server 2008 R2 Excel 导入

sql server使用合并单元格导入excel数据

从 Excel 导入 SQL Server 2005 时出现截断错误

自动将不同的 Excel 文件导入 MS Access 2010 表