首页 > 解决方案 > SQL Server 中的 Python 脚本 / sp_execute_external_script / pyodbc 错误

问题描述

我需要在 SQL Server 中使用 Python 脚本构建模型。但它需要有多个输入数据集。我猜你只能拥有一个。我读到一种方法是在 sp_execute_external_script 中使用 pyodbc。

但它不会连接。完全相同的代码在 Spyder 中确实有效,因此这不是一般的配置问题(我也可以从 Tableau 等连接)。因为它是本地实例,所以我尝试使用点 (.) 作为服务器名称,但这不起作用,所以我也尝试将服务器和实例名称完整地放入(因此下面有两个不同的连接字符串)。

编码:

EXEC sp_execute_external_script 
@language =N'Python',
@script=N'

import pyodbc

sql_conn = pyodbc.connect("DRIVER={ODBC Driver 17 for SQL Server};SERVER=XXX\YYY;DATABASE=MY_PYTHON;trusted_connection=Yes")

sql_conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};Server=.;Database=MY_PYTHON;Trusted_Connection=Yes;")
'

错误信息:

消息 39004,级别 16,状态 20,第 52 行在
执行“sp_execute_external_script”期间发生“Python”脚本错误,HRESULT 为 0x80004004。消息 39019,级别 16,状态 2,第 52 行
发生外部脚本错误:

执行错误。检查输出以获取更多信息。回溯(最后一次调用):
文件“”,第 5 行,在
文件“C:\ProgramData\GTMDEV\Temp-PY\Appcontainer1\A0F0D72C-4B70-46BD-8307-D51C36E9A8F1\sqlindb_0.py”,第 39 行,在transform
sql_conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};Server=.;Database=MY_PYTHON;Trusted_Connection=Yes;")

消息 39019,级别 16,状态 2,第 52 行
出现外部脚本错误:
pyodbc.OperationalError: ('08001', '[08001] [Microsoft][ODBC Driver 17 for SQL Server]Named Pipes Provider: 无法打开连接到 SQL Server [2]. (2) (SQLDriverConnect); [08001] [Microsoft][ODBC Driver 17 for SQL Server]登录超时已过期 (0); [08001] [Microsoft][ODBC Driver 17 for SQL Server]A建立与 SQL Server 的连接时发生网络相关或特定于实例的错误。找不到或无法访问服务器。请检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 书籍在线。(2)')

SqlSatelliteCall 错误:执行错误。检查输出以获取更多信息。
来自外部脚本的 STDOUT 消息:
SqlSatelliteCall 函数失败。请参阅控制台输出以获取更多信息。
回溯(最后一次调用):
文件“C:\Program Files\Microsoft SQL Server\MSSQL15.GTMDEV\PYTHON_SERVICES\lib\site-packages\revoscalepy\computecontext\RxInSqlServer.py”,第 605 行,在 rx_sql_satellite_call
rx_native_call("SqlSatelliteCall ", params)
文件 "C:\Program Files\Microsoft SQL Server\MSSQL15.GTMDEV\PYTHON_SERVICES\lib\site-packages\revoscalepy\RxSerializable.py",第 375 行,在 rx_native_call
ret = px_call(functionname, params) RuntimeError: revoscalepy 函数失败。

Internet 研究使我在 SQL Server 中为 SQLRUserGroupYYY 创建了一个登录名,并将其添加到本地安全策略中的“允许本地登录”中。但这并没有改变任何事情。而且我找不到其他任何有效的方法。

如果相关,服务器在我的 PC 上,它的名称是 MYPCNAME\MYNAMEDINSTANCE。(并且名称是正确的并且它正在运行(在错误消息中建议),因为连接在 Spyder、Tableau 等中有效)。

有什么想法我还能尝试吗?

谢谢。

作为参考,这是建议该方法的文章之一:

https://medium.com/wandering-in-advanced-analytics/passing-multiple-t-sql-queries-to-sp-execute-external-script-and-loop-back-requests-d153ee582235

给出的示例是针对 R 的,但原理应该与 Python 相同。我确实在 R 中尝试过,并得到了相同的错误消息。

这是另一篇具有相同问题的帖子(包含 SQLRUserGroup 登录建议的链接):

在 sp_execute_external_script 中使用 pyodbc.OperationalError

标签: pythonsql-serverpyodbc

解决方案


推荐阅读