跨服务器登录时无法从Excel电子表格执行SQL查询的问题
我有一段SQL代码,用于读取Excel工作表数据并更新数据库表。平时我通过SSMS先登录公司网络服务器,再通过该连接访问数据库服务器(即客户端通过SSMS中转连接数据库),这种方式下大部分操作都正常,唯独读取Excel的SELECT语句无法运行,必须直接登录数据库服务器才行,想解决这个繁琐的问题。
能在直接登录服务器时正常运行,但远程中转连接时失效的SQL语句:
select * from openrowset('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml;Database=\\tsclient\C\Users\FRate.xlsx;',sheet1)
远程中转连接执行时收到的错误:
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
1. 问题根源
\\tsclient\C是远程桌面映射的本地客户端路径,但数据库服务器的SQL Server服务账户无法访问你本地客户端的文件系统——OPENROWSET是在数据库服务器端执行的,它会尝试让SQL Server服务去访问这个路径,而服务器根本看不到你本地的C盘映射。直接登录服务器时你是在服务器本地操作,Excel文件路径是服务器能访问的,所以正常。
2. 具体解决方案
方法一:将Excel放到服务器可访问的共享目录
- 把本地的
FRate.xlsx上传到公司网络中数据库服务器有权限读取的共享文件夹(比如\\公司文件服务器\公共数据\FRate.xlsx) - 修改SQL语句中的路径为这个共享路径:
select * from openrowset('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0 Xml;Database=\\公司文件服务器\公共数据\FRate.xlsx;',sheet1)
- 确认SQL Server的服务账户(比如
NT SERVICE\MSSQLSERVER)对该共享文件夹有读取权限
方法二:配置分布式查询委派(适合高频使用场景)
- 打开SQL Server配置管理器,找到对应SQL Server服务,右键属性→登录,确认服务账户是域账户(本地系统账户无法做委派)
- 联系域管理员,在Active Directory中给该SQL Server服务账户配置约束委派,允许它向你的客户端计算机委派权限,并勾选
Microsoft.ACE.OLEDB.12.0相关服务类 - 启用Ad Hoc分布式查询:
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
- 配置OLEDB提供者参数:
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1 EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DisallowAdHocAccess', 0
方法三:用SSMS导入向导替代OPENROWSET
- 打开SSMS,右键目标数据库→任务→导入数据
- 数据源选择“Microsoft Excel”,选中本地的Excel文件,按向导步骤将数据导入到临时表,再用临时表更新目标表
- 此方法无需修改服务器配置,适合单次或少量数据导入场景
内容的提问来源于stack exchange,提问作者TeleJim

