【问题标题】:Get Excel sheet into temp table using a script使用脚本将 Excel 工作表放入临时表
【发布时间】:2012-08-18 21:43:58
【问题描述】:

我正在尝试将此 excel 工作表放入表格中,因此我可以对其应用 select 语句等,以使用其信息更新表格。

SELECT * 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
          'Excel 8.0;Database=C:\PB.xlsx',
          'SELECT * FROM [Sheet1$]')

我正在运行 64 位机器。 不知道是什么excel版本。

错误:

消息 7399,第 16 级,状态 1,第 1 行 链接服务器“(null)”的 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”报告错误。提供商没有提供有关该错误的任何信息。 消息 7303,第 16 层,状态 1,第 1 行 无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”的数据源对象。

当我更改为 Excel 12.0 时;

链接服务器“(null)”的 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”返回消息“找不到可安装的 ISAM。”。 消息 7303,第 16 层,状态 1,第 1 行 无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”的数据源对象。

【问题讨论】:

  • 当我收到这些错误时,我们的 DBA 告诉我这是因为该驱动程序需要安装在服务器上。它安装在您的设备上吗?
  • @bluefeet 这是我目前的笔记本电脑,我没有安装任何额外的东西,所以如果它不在 2008 R2 中。然后不行。
  • 前段时间,由于 32/64 位 ODBC 驱动程序不兼容,我遇到了 7399 错误。我试图将数据从 Excel 工作表读取到 SQL Server 2008 R2 64 位。 Microsoft-Jet.OleDB 驱动程序是 32 位的。不幸的是我无法解决这个问题,我不得不安装一个 32 位服务器来读取 excel 文件。
  • 我不小心运行了错误的服务器,所以它是 32 位的,它根本无法在我的笔记本电脑上运行。存在同样的问题。我已经改用 CSV 文件格式,似乎可以正常工作。谢谢大家。

标签: sql sql-server sql-server-2008 excel


【解决方案1】:

对于 xlsx 文件 (Excel 2007-2010),您可以使用 ACE oledb 提供程序而不是 JET

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0;HDR=YES;Database=C:\PB.xlsx',
    'SELECT * FROM [Sheet1$]');

【讨论】:

【解决方案2】:

此错误有 5 个可能的原因。

  1. 喷气发动机必须安装在服务器上。在服务器上安装 MS Office 可以解决这个问题。
  2. xls 的路径是相对于服务器的,而不是您运行命令的工作站
  3. 运行 SQL Server 服务的帐户必须对 xls 所在的文件夹具有写入权限。一种可能的解决方案是将服务启动帐户(例如管理员)的 temp= 和 tmp= 环境变量更改为(例如)c:\temp,然后对每个人启用对 c:\temp 的完全控制

4...

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO

5....

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 0 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 0
GO 

现在我不知道为什么会这样,尤其是考虑到其他人都说应该将它们设置为 1。然而,对我来说,将它们设置为零,在 SQL Server 2008R2 32 位和 M 上执行以下 SQL 语句的技巧$ Office 2007

Select * 
into [temp_table$]
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=C:\temp\EXPENDITURE REPORT.xls;HDR=YES;IMEX=1',
'SELECT * FROM [EXPENDITURE SHEET$]')

注意:我特意使用了一个示例,其中文件名和工作表名都有空格,以表明可以这样做。

【讨论】:

  • 我最后使用了 csv 文件,但由于详细的多选项答案而将其标记为正确。
  • 正如另一个答案中提到的,您可以尝试Microsoft.ACE.OLEDB.12.0,即使使用Excel 8.0
  • 加 1 表示在名称中使用空格。
【解决方案3】:

以防万一其他人在几年后像我一样偶然发现,这对我有用:

我们有一个在 Windows 8 64 位机器上安装 SQL Server Express 2012 的盒子,没有安装任何版本的 Office。

这是我设置的存储过程的一部分:

INSERT INTO OPENROWSET ('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=R:\Export Membership Database\Member_Export.xls;',
'SELECT * FROM [combined$]')

(下面的 SELECT 语句的其余部分)

我收到了这个错误:

SQL Server 阻止了对 STATEMENT 'OpenRowset/OpenDatasource' 的访问 组件“即席分布式查询”,因为该组件是 作为该服务器的安全配置的一部分而关闭。一种 系统管理员可以启用“Ad Hoc Distributed 使用 sp_configure 进行查询。有关启用的更多信息 “即席分布式查询”,搜索“即席分布式查询” 在 SQL Server 联机丛书中。

我们更改了配置:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO

再次运行存储过程,然后得到这个错误:

OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”尚未 已注册。

发现我们需要安装这个:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c06b8369-60dd-4b64-a44b-84b371ede16d&displaylang=en

在那之后,工作就像一个魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多