SQL Server存储过程传文件路径给Python脚本执行报错如何解决
报错根因
- 变量引用规则错误:
sp_execute_external_script运行的Python脚本无法直接识别SQL存储过程的参数@filepath,Python语法中@是装饰器关键字,直接写@filepath不符合Python语法,直接触发语法报错。 - 额外潜在问题:Windows路径的反斜杠存在转义冲突、SQL Server外部脚本运行账户无目标路径读取权限也会导致后续执行报错。
可行解决方案
第一步:修正存储过程的参数传递逻辑
通过sp_execute_external_script的@params参数完成SQL变量到Python变量的映射,修正后的存储过程代码如下:
DROP PROCEDURE IF EXISTS ScrapeData; GO CREATE PROCEDURE [dbo].[ScrapeData] (@filepath varchar(300)) AS BEGIN EXEC sp_execute_external_script @language = N'Python', @script = N' import html2text from bs4 import BeautifulSoup import pyodbc import re import requests import pandas as pd import os # 使用映射后的Python变量,同时规范化路径处理转义问题 with open(os.path.normpath(input_filepath), encoding="utf-8") as f: contents = f.read() soup = BeautifulSoup(contents, ''lxml'') # 后续原有逻辑保持不变 ', -- 新增参数映射配置 @params = N'@input_filepath varchar(300)', @input_filepath = @filepath END GO
第二步:修正路径传入格式
调用存储过程时,将路径中的反斜杠替换为正斜杠避免转义冲突,示例调用语句:
EXEC ScrapeData 'F:/FinancialResearch/SEC/myEdgar/sec-edgar-filings/WIRE/10-Q/0001753926-20-000110/full-submission.txt'
第三步:配置文件读取权限
给SQL Server Launchpad服务的运行账户开放目标文件夹的读取权限:
- 找到
F:\FinancialResearch\SEC\myEdgar文件夹,右键属性-安全-编辑-添加,输入NT Service\MSSQLLaunchpad(如果是命名实例则为NT Service\MSSQLLaunchpad$实例名),授予读取和列出文件夹目录权限。 - 若开启了AppContainer隔离,可执行如下语句验证访问权限,输出为True则说明权限正常:
EXEC sp_execute_external_script @language=N'Python', @script=N' import os print(os.access("F:/FinancialResearch/SEC/myEdgar", os.R_OK)) '
内容的提问来源于stack exchange,提问作者David Olsen
相关产品推荐
相关产品推荐

