无法从具有多个 SQL Server 版本的 SQL Server 读取 Excel 文件

Posted

技术标签:

【中文标题】无法从具有多个 SQL Server 版本的 SQL Server 读取 Excel 文件【英文标题】:Cannot read Excel file from SQL Server with multiple versions of SQL Server 【发布时间】: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 【参考方案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】:

试试这些设置

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

【讨论】:

你能解释一下 -g512 的值吗?

以上是关于无法从具有多个 SQL Server 版本的 SQL Server 读取 Excel 文件的主要内容,如果未能解决你的问题,请参考以下文章

具有不同所有者的 SQL Server 所有权链跨架构,用于从多个架构中选择视图

如何从 WSL 连接到本地 Windows SQL Server 实例?

如何从 WSL 连接到本地 Windows SQL Server 实例?

Django 无法使用多个主键修改 SQL Server 中的一行

sq server2008登录不上去了,用windows身份也不行,怎么弄呀

数据表中的多个子行,来自asp.net核心中sql server的数据