必须用sp_execute_external_script调用Python,启用后需重启SQL Server服务;参数须严格匹配类型与大小写;输出必须赋值给OutputDataSet DataFrame;必须显式import pandas等库,禁止读本地文件。

必须用 sp_execute_external_script,不能拼接字符串或调用外部 Python 文件——后者既绕过 SQL Server 的 Python 沙箱,又大概率因权限/路径问题失败。
启用外部脚本后必须重启 SQL Server 服务
光执行 sp_configure 不生效。常见错误是看到 “Configuration option 'external scripts enabled' changed…” 就以为完事了,结果一跑就报 external scripts are not enabled。
- 先运行:
EXEC sp_configure 'external scripts enabled', 1; RECONFIGURE; - 然后必须在 Windows 服务管理器中手动重启对应实例的服务(如
SQL Server (MSSQLSERVER)或命名实例) - 验证是否真生效:
EXEC sp_execute_external_script @language = N'Python', @script = N'print(42)';—— 成功则输出 42 到“消息”窗口,不报错
@params 声明和脚本内变量名必须完全一致
传参不是字符串替换,而是由 SQL Server 运行时注入变量到 Python 命名空间。漏类型、错大小写、多写 @ 都会失败。
- 正确写法:
@params = N'@x INT, @y NVARCHAR(50)', @x = 123, @y = N'test',且@script内必须直接用x和y(无@) - 错误写法:
@params = N'@x'(缺类型)、@script = N'print(@x)'(Python 里没这个语法)、@params = N'@X INT'但脚本里写x(大小写敏感) - 所有标量参数在 Python 脚本里都是裸变量,不进
sys.argv,也不需要argparse
输出必须赋值给 OutputDataSet 且类型严格匹配
只 print() 或 return 不会产生结果集;SQL Server 强制要求你把最终结果塞进名为 OutputDataSet 的 pandas.DataFrame。
- 哪怕返回单个数字:
import pandas; OutputDataSet = pandas.DataFrame([[x * 2]], columns=['result']) -
WITH RESULT SETS子句的列名、顺序、类型必须和OutputDataSet完全一致,否则报类型转换失败 - 如果脚本里没
import pandas,会直接报NameError: name 'pandas' is not defined—— 必须显式 import - 别在脚本里读本地文件(如
pd.read_csv('data.csv')),工作目录不可控,权限也受限;数据应通过@input_data_1传入
最常被忽略的一点:每次调用都是干净沙箱,没有缓存、没有跨调用状态,所有 import 和初始化都得在 @script 字符串里写全——连 import numpy as np 都不能省。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











