必须用sp_execute_external_script而非xp_cmdshell;启用外部脚本需sp_configure后重启sql server服务;参数传递须@params显式声明类型且变量名一致;输出必须赋值给outputdataset dataframe;禁止相对路径和临时文件;每次调用均为干净沙箱,import需在脚本内写全。

直接用 sp_execute_external_script,别绕路写 xp_cmdshell 调外部 Python 文件——后者权限高、难调试、不走 SQL Server 的 Python 运行时沙箱,还容易被禁用。
必须启用外部脚本且重启服务
SQL Server 默认禁用 Python 执行,光执行 sp_configure 不够,必须重启数据库服务才生效:
- 运行
EXEC sp_configure 'external scripts enabled', 1; RECONFIGURE; - 在 Windows 服务管理器中重启
SQL Server (MSSQLSERVER)或对应实例名的服务 - 验证是否生效:
EXEC sp_execute_external_script @language = N'Python', @script = N'print(1)';若报错 “external scripts are not enabled”,就是没重启
@params 和 @script 中变量名必须严格一致
传参不是靠字符串拼接,而是通过 @params 显式声明参数类型和绑定关系。常见错误是脚本里用了 myvar,但 @params 里写成 @x 或漏掉类型声明:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 正确写法:
@params = N'@myval INT', @myval = 42,且@script内必须用myval(无@前缀) - 错误写法:
@params = N'@myval'(缺类型)、@script里写@myval(Python 不认 SQL 变量语法) - 注意:所有传入 Python 的参数,在脚本里都是裸变量名,不是
sys.argv;sys.argv在 SQL Server 的 Python 沙箱中不可用
输出必须赋值给 OutputDataSet
SQL Server 强制要求 Python 脚本把结果写进名为 OutputDataSet 的 pandas DataFrame,否则返回空结果或报错 Output data set is not defined:
- 即使只返回一个标量,也要包成 DataFrame:
OutputDataSet = pandas.DataFrame([[c]], columns=['result']) - 不能只写
print()或return——那些只输出到消息窗口,不进结果集 - 如果脚本没导入
pandas,会报NameError: name 'pandas' is not defined;必须显式import pandas -
WITH RESULT SETS的列定义必须与OutputDataSet列名、类型、顺序完全匹配,否则报类型转换失败
别在脚本里写相对路径或依赖本地文件
SQL Server 的 Python 进程工作目录不固定,且无权访问用户桌面或网络路径。所有数据都该通过 @input_data_1 传入,或用 revoscalepy 读库表:
- 避免:
pd.read_csv('C:\temp\data.csv')—— 很可能 Permission denied 或 FileNotFoundError - 推荐:
@input_data_1 = N'SELECT * FROM dbo.mytable WHERE id > @pid',再用InputDataSet接收 - 如需读外部数据源,用
revoscalepy.RxSqlServerData构建数据源对象,它专为 SQL Server 环境设计,支持连接池和权限隔离 - 临时写文件?不行。Python 进程无写权限到多数目录,且文件残留会污染环境
最易被忽略的是:Python 脚本里所有 import 都得在 @script 字符串内写全,不能靠“提前装好就不用导”——每次调用都是干净的沙箱进程,没缓存、没全局状态。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










