SQL Server 2017 不支持直接调用 Python,需安装 CU3+、启用 Machine Learning Services(选装 Python)、配置 external scripts enabled 并重启服务。

SQL Server 2017 是否支持直接调用 Python?
不支持。SQL Server 2017 原生只支持 sp_execute_external_script 调用 R 脚本,Python 是从 SQL Server 2017 CU3(2018年4月)起才通过 R Services(后改名 Machine Learning Services)以「可选组件」形式加入,且必须手动启用并安装 Python 运行时。
如果你的实例没装 Python 或没启用外部脚本,sp_execute_external_script 执行 Python 会直接报错:Msg 39023, Level 16, State 1: External script execution is not enabled.
启用 Python 支持前必须确认的三件事
跳过任一环节都会导致调用失败,不是代码问题,而是环境缺失:
- 已安装
SQL Server 2017 CU3 或更高版本(CU22 是最后一个支持 2017 的更新) - 安装 SQL Server 时勾选了
Machine Learning Services (In-Database),且安装过程中明确选择了Python(R 可选,Python 必须选) - 执行过以下两条系统配置(需 sysadmin 权限):
EXEC sp_configure 'external scripts enabled', 1; RECONFIGURE;
以及EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
执行完记得重启 SQL Server 服务——仅 RECONFIGURE 不生效。
立即学习“Python免费学习笔记(深入)”;
在存储过程中安全调用 Python 的最小可行写法
核心是把 Python 逻辑封装进 sp_execute_external_script,再嵌入存储过程。注意:不能用 xp_cmdshell 或 CLR 调用外部 .py 文件,那属于绕过安全模型,且不可控、无输入/输出绑定。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
下面是一个读取输入参数、返回简单计算结果的示例:
CREATE OR ALTER PROCEDURE dbo.usp_CalcWithPython
@input_value INT
AS
BEGIN
DECLARE @py_script NVARCHAR(MAX) = N'
import pandas as pd
# 输入数据自动映射到 InputDataSet(必须是 pandas DataFrame)
OutputDataSet = pd.DataFrame({"result": [InputDataSet["val"].iloc[0] ** 2 + 42]})
';
<pre class="brush:php;toolbar:false;">EXEC sp_execute_external_script
@language = N'Python',
@script = @py_script,
@input_data_1 = N'SELECT @input_value AS val',
@input_data_1_name = N'InputDataSet',
@params = N'@input_value INT',
@input_value = @input_value
WITH RESULT SETS ((result INT));END;
关键点:
-
@input_data_1必须是合法 SELECT 语句,不能是变量或表达式;想传标量就包成单行单列查询 - Python 中接收数据靠
InputDataSet(固定名),返回靠OutputDataSet(也固定),且必须是pandas.DataFrame -
@params和后续参数绑定顺序必须严格对应,否则报Must declare the scalar variable - 返回列名和类型要在
WITH RESULT SETS中声明,否则报Invalid column name
常见报错与定位方法
多数失败不在 Python 语法,而在上下文隔离或权限链路上:
-
Unable to launch runtime for 'Python':说明 Python 运行时未注册或路径损坏,检查C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES是否存在且有python.exe -
Permission denied on object 'sp_execute_external_script':执行用户缺少EXECUTE ANY EXTERNAL SCRIPT数据库权限,需显式授权:GRANT EXECUTE ANY EXTERNAL SCRIPT TO [user_name];
- Python 报
ModuleNotFoundError:SQL Server 的 Python 环境是独立副本(位于PYTHON_SERVICES目录),pip install必须指向它,例如:"C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\PYTHON_SERVICES\python.exe" -m pip install numpy
调试建议:先在 SSMS 单独执行 sp_execute_external_script 片段,确认能跑通,再封装进存储过程;不要一上来就写复杂逻辑。

















