如何解决SQL Server通过Python读取共享路径Excel时的Errno 13权限错误?
使用SQL Server 2019 + Python 3.10,执行sp_execute_external_script读取远程共享路径的Excel文件时,触发权限拒绝错误。
执行的代码:
EXECUTE sp_execute_external_script @language = N'Python', @script = N'import pandas as pd df = pd.read_excel(r"\\192.168.7.9\Import\10\test\testData.xlsx", sheet_name = "Sheet1") print(df)';
错误信息:
Msg 39019, Level 16, State 2, Line 48
An external script error occurred:self.book = xlrd.open_workbook(self.io)
File "D:\SQL Data\MSSQL15.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\xlrd_init.py", line 111, in open_workbook
with open(filename, "rb") as f:
PermissionError: [Errno 13] Permission denied: '\192.168.7.9\Import\10\test\testData.xlsx'SqlSatelliteCall error: Error in execution. Check the output for more information.
STDOUT message(s) from external script:
SqlSatelliteCall function failed. Please see the console output for more information.Traceback (most recent call last):
File "D:\SQL Data\MSSQL15.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy\computecontext\RxInSqlServer.py", line 605, in rx_sql_satellite_call
rx_native_call("SqlSatelliteCall", params)File "D:\SQL Data\MSSQL15.MSSQLSERVER\PYTHON_SERVICES\lib\site-packages\revoscalepy\RxSerializable.py", line 375, in rx_native_call
已确认自身账号有共享路径读写权限,且Excel文件未打开,问题仍存在。
执行Python外部脚本的进程并非以你的账号运行,而是由SQL Server Launchpad服务启动,默认使用NT Service\MSSQLLaunchpad账号,该系统账号默认没有访问网络共享文件夹的权限。你自身的权限和服务账号权限相互独立,这是导致权限拒绝的核心原因。
1. 配置Launchpad服务账号的共享权限
- 打开Windows服务管理器(运行
services.msc),找到SQL Server Launchpad (MSSQLSERVER),查看其登录身份。 - 远程访问共享服务器
\\192.168.7.9,定位到Import\10\test文件夹:- 右键文件夹→属性→安全→编辑→添加
- 输入Launchpad服务的账号(如
NT Service\MSSQLLaunchpad),点击检查名称确认后,授予读取和写入权限。
- 若为域环境,可将该服务账号加入拥有共享权限的域组,简化权限管理。
2. 改用本地路径中转(可选)
将Excel文件复制到SQL Server服务器的本地磁盘(如D:\SQL_Import\),修改Python代码读取本地路径:
EXECUTE sp_execute_external_script @language = N'Python', @script = N'import pandas as pd df = pd.read_excel(r"D:\SQL_Import\testData.xlsx", sheet_name = "Sheet1") print(df)';
这种方式无需配置网络共享权限,但需要额外维护文件同步逻辑。
3. 验证权限有效性
可通过xp_cmdshell测试服务账号是否能访问共享路径:
EXEC xp_cmdshell 'dir \\192.168.7.9\Import\10\test'
若返回权限错误,说明权限配置未生效,需重新检查共享权限设置或服务账号身份。
内容的提问来源于stack exchange,提问作者ahmed barbary

