【问题标题】:Cannot read Excel file from SQL Server with multiple versions of SQL Server无法从具有多个 SQL Server 版本的 SQL Server 读取 Excel 文件
【发布时间】:2015-03-28 12:08:42
【问题描述】:
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO

EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO

USE [master] 
GO 

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1 
GO 

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 
GO

阅读 Excel

DECLARE @SQLconnect VARCHAR(8000)

SET @SQLconnect =  'SELECT * FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',
                       ''Excel 8.0;Database=D:\WAGES.xlsx;'', 
                       ''SELECT * FROM [Sheet2$]'')'
                       EXEC (@SQLconnect) 

例外

消息 7399,第 16 层,状态 1,第 1 行
链接服务器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”报告错误。提供商报告了意外的灾难性故障。

消息 7303,第 16 级,状态 1,第 1 行
无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象。

有时会出错,有时会进入无限循环执行。

注意:在 SQL Server 2012 上安装 SQL Server 2008 R2 后出现此错误。

  • 操作系统:Windows 7 32 位
  • 已安装 SQL Server 2008 R2 和 SQL Server 2012

【问题讨论】:

  • 您是否尝试过直接执行,而不是在动态 SQL 中?您使用动态 SQL 的任何原因?在 SQL Server 上是 D:\WAGES.xlsx 吗?
  • 两种方法我都试过了。是的,D:\ 上的 Wages.xlsx 和同一台机器上的 SQL Server

标签: sql sql-server sql-server-2008-r2 sql-server-2012 openrowset


【解决方案1】:

如果用户对 SQL Server TEMP 目录没有权限,则 SQL Server 错误消息:

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

授予 TEMP 目录权限
(i.) 只有具有任何 OLE DB 提供程序的 32 位 SQL Server 才需要此步骤

主要问题是 OLE DB 提供程序在查询期间使用运行查询的用户的凭据在 SQL Server 临时目录中创建临时文件。

SQL Server 的默认目录是 SQL Server 服务帐户的默认目录。

如果 SQL Server 在网络服务帐户下运行,则临时目录如下:

C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp

如果 SQL Server 在本地服务帐户下运行,则临时目录如下:

C:\Windows\ServiceProfiles\LocalService\AppData\Local\Temp

微软推荐了两种解决方法:

更改 SQL Server TEMP 目录并授予所有用户对该目录的完全权限。 授予对当前 SQL Server TEMP 目录的读/写权限。

查看详情:PRB:"Unspecified error" Error 7399 Using OPENROWSET Against Jet Database

通常只有少数帐户用于导入操作。所以我们可以为这些帐户添加权限。

例如,icacls 实用程序可用于权限设置:

icacls C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp /grant vs:(R,W)

更多信息请关注Link

【讨论】:

  • @Rajeshirke 我根据您来自此link 的错误消息进行回答,我认为该链接可以为您提供更多帮助。
  • 其实在安装Microsoft SQL Server 2012的时候是可以的,但是在安装SQL Server 2008 R2之后就出现了问题..
【解决方案2】:

试试这些设置

  1. 打开 SQL Server 配置管理器。
  2. 在左侧窗格中选择 SQL Server Services 文件夹。
  3. 右键单击右侧窗格中的 SQL Server (MSSQLSERVER) 服务。
  4. 点击属性。
  5. 在弹出的属性对话框中单击“高级”选项卡。
  6. 添加“-g512;”到参数“启动参数”值的前面。
  7. 点击确定。

【讨论】:

  • 你能解释一下 -g512 的值吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多