You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程传文件路径给Python脚本执行报错如何解决

报错根因

  1. 变量引用规则错误:sp_execute_external_script 运行的Python脚本无法直接识别SQL存储过程的参数@filepath,Python语法中@是装饰器关键字,直接写@filepath不符合Python语法,直接触发语法报错。
  2. 额外潜在问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:27:02