将Excel 2010导入SQL Server

时间:2013-03-15 04:55:28

标签: tsql sql-server-express sql-server-2012-express

我用Excel收集&配置数据,然后将其导入SQL Server 2012进行存储。

到目前为止,我一直在使用SQL Server Import&导出向导,但不断手动设置它是一件痛苦的事。由于我使用Express,当然它不允许我保存甚至查看传输数据的实际命令。

我尝试按How to use Excel with SQL Server linked servers and distributed queries设置链接服务器,但收到以下错误:

  

已创建链接服务器但连接测试失败。您想保留链接服务器吗?

     

执行Transact-SQL语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)

     

无法初始化OLE DB提供程序的数据源对象" Microsoft.Jet.OLEDB.4.0"对于链接服务器" FLTST"。
  OLE DB提供程序" Microsoft.Jet.OLEDB.4.0"对于链接服务器" FLTST"返回消息"未指定错误"。 (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

这给了我以下错误:

  

OLE DB提供程序" Microsoft.Jet.OLEDB.4.0"对于链接服务器"(null)"返回消息"未指定错误"。
  Msg 7303,Level 16,State 1,Line 3
  无法初始化OLE DB提供程序的数据源对象" Microsoft.Jet.OLEDB.4.0"对于链接服务器"(null)"。

而不是去SQL Server&把数据拉进去,我应该留在Excel&推开它?

我做错了什么?

PS:不要告诉我将其转换为csv文件!我试图做更少的步骤,而不是更多!

2 个答案:

答案 0 :(得分:2)

在你的问题中遇到类似的问题,我已经对此做了一些研究。我的问题尚未完全解决,但我想我可能会更进一步。虽然问题很严重,但也许还有其他人需要帮助。

通过运行:

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml;HDR=YES;Database=P:\Path\File.xlsx','SELECT * FROM [Sheet1$]');
GO

我收到以下错误消息:

  

Msg 15281,Level 16,State 1,Line 19   SQL Server阻止访问STATEMENT' OpenRowset / OpenDatasource'组件' Ad Hoc Distributed Queries'因为此组件已作为此服务器的安全配置的一部分关闭。系统管理员可以启用“Ad Hoc Distributed Queries”'通过使用sp_configure。有关启用“即时分布式查询”的详细信息,请搜索“即时分布式查询”和“即时分布式查询”。在SQL Server联机丛书中。

要解决此问题,请执行以下操作:

sp_configure 'show advanced options', 1  
RECONFIGURE  
GO  
sp_configure 'ad hoc distributed queries', 1  
RECONFIGURE  
GO 

但是我得到了一个新的错误信息:

  

Msg 7302,Level 16,State 1,Line 19   无法创建OLE DB提供程序的实例" Microsoft.ACE.OLEDB.12.0"对于链接服务器"(null)"。

纠正我的行为:

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

但我得到了这个错误:

  

Msg 7438,Level 16,State 1,Line 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  

答案 1 :(得分:0)

  1. 使用Excel数据源连接管理器创建SSIS包,目标是您的SQL Express,OLE DB目标
  2. 创建Excel连接管理器时,您只能使用一个现有的Excel文件
  3. 定义一个用户变量,例如user :: sourceFile,用于输入excel文件的完整路径
  4. 创建Excel连接管理器后,右键单击 - > preperties->找到“表达式”,只需将[User :: sourceFile]提供给Expression
  5. 即可
  6. 只需创建一个从源到目标的简单数据流
  7. 保存并调试您的SSIS包,确保所有凭据工作和数据都可以流入目标表。注意:请勿使用机器密钥
  8. 保存包中的敏感数据
  9. 每次需要加载新文件时,请使用DTEXEC执行包并覆盖参数
  10. 祝你好运