Tsql 将Excel 2010导入SQL Server

Tsql 将Excel 2010导入SQL Server,tsql,sql-server-express,sql-server-2012-express,Tsql,Sql Server Express,Sql Server 2012 Express,我使用Excel收集和配置数据,然后将其导入SQL Server 2012进行存储 到目前为止,我一直在使用SQL Server导入和导出向导,但是经常手动设置它是一件痛苦的事情。由于我使用的是Express,它当然不允许我保存,甚至不允许我查看传输数据的实际命令 我尝试按设置链接服务器,但出现以下错误: 已创建链接服务器,但连接测试失败。是否要保留链接的服务器 执行Transact-SQL语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo) 无法为链

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


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

我尝试按设置链接服务器,但出现以下错误:

已创建链接服务器,但连接测试失败。是否要保留链接的服务器

执行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)我实际拥有的
所有这些都给了我相同的结果

接下来,我尝试了分布式查询,如中所示(同样是提供程序字符串的不同变体)

这给了我以下错误:

链接服务器的OLE DB提供程序“Microsoft.Jet.OLEDB.4.0”(null)返回消息“未指定错误”。
味精7303,第16级,状态1,第3行
无法为链接服务器(null)初始化OLE DB提供程序“Microsoft.Jet.OLEDB.4.0”的数据源对象

我是否应该留在Excel中并将其推送过来,而不是转到SQL Server并将数据拉入

我做错了什么

PS:请不要告诉我将其转换为csv文件!我试着少走几步,而不是多走几步

  • 使用Excel数据源连接管理器创建SSIS包,目标是SQL express,OLE DB目标
  • 创建Excel连接管理器时,您可以只使用一个现有的Excel文件
  • 定义一个用户变量,如user::sourceFile,用于输入excel文件的完整路径
  • 创建Excel连接管理器后,右键单击->preperties->查找“表达式”,只需将[User::sourceFile]指定给表达式即可
  • 只需创建一个从源到目标的简单数据流
  • 保存并调试SSIS包,确保所有凭证工作和数据都可以流入目标表。注意:不要用机器密钥加密的方式将sensitvie数据保存在软件包中
  • 每次需要加载新文件时,使用DTEXEC执行包并重写参数

  • 祝你好运

    我在这方面做了一些研究。我的问题还没有完全解决,但我想我可能会让你更进一步。尽管这个问题由来已久,但也许还有其他人需要帮助

    通过运行:

    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,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
    
    但是我得到了这个错误:

    Msg 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  
    

    “经常手动设置是一件痛苦的事情”。这是因为Excel字段发生了更改,还是因为您不喜欢使用向导?您应该能够保存包并在下次重新运行它。。。。我想-对SQL Express不是100%确定。在您的情况下,我可能只编写一个小C#应用程序,读取Excel并从中获取所需的数据,然后将这些行插入SQL Server。众所周知,“Jet OleDB”驱动程序很难使用,特别是在64位服务器操作系统上,因此如果可能的话,我会避免使用这些驱动程序。如果excel文件架构没有更改,只有文件名在更改,那么,您可以试着用动态源设置SSIS包来解决问题,您不需要每次都通过向导,只要在每次源代码更改时更新SSIS配置即可。我没有忘记您,我只是没有时间使用您的解决方案来尝试使其正常工作:(
    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