在SQL Server存储过程中导入Python脚本



我有一堆本地Python脚本,需要从本地MS SQL Server执行。如果我尝试导入标准Python库(例如panda(,就没有问题。当我试图导入一个名为Simulator.py的Python文件时,我遇到了一个错误,该文件位于C:\Users/amusaeva/PyCharmProjects/ARW/WorkforceModel文件夹中。

EXEC sp_execute_external_script @language =N'Python',
@script=N'
import sys
sys.path.insert(0, "C:/Users/amusaeva/PyCharmProjects/ARW/WorkforceModel")
import Simulator
'

以下是我在运行此SQL脚本时收到的错误消息:

Msg 39004,级别16,状态20,第0行
在使用HRESULT 0x80004004执行"sp_execute_external_script"期间发生"Python"脚本错误。

Msg 39019,Level 16,State 2,Line 0
发生外部脚本错误:

执行中出错。检查输出以了解更多信息。追溯(最近一次调用(:
文件";,第5行,在
文件"C: \ProgramData\MSSQLSERVER\Temp PY\Appcontainer1\D4294516-2993-475D-9F61-DF7C5AF4FE69\sqlindb_0.PY";,第35行,在变换中

import Simulator
ModuleNotFoundError:没有名为"Simulator"的模块

SqlSatelliteCall错误:执行中出错。检查输出以了解更多信息
来自外部脚本的STDOUT消息:
SqlSatelliteCall函数失败。有关详细信息,请参阅控制台输出。

追溯(最近一次调用(:
文件"C: \Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\PYTON_SERVICES\lib\site packages\revoscalepy\computecontent\RxInSqlServer.py",第605行,在rx_sql_ssatellite_call中
rx_snative_call("SqlSatelliteCall",params(

文件";C: \Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\PYTON_SERVICES\lib\site packages\revoscalepy\RxSerializable.py",第375行,在rx_anative_call中
ret=px_call(函数名,参数(

RuntimeError:revoscalepy函数失败。

我知道WorkforceModel目录中肯定有一个名为Simulator.py的Python脚本,我不认为我有任何语法错误,因为当我通过PS窗口在Python中运行正好三行时,模块可以顺利导入。为什么我的存储过程看不到Python脚本?

原来我需要整理一些权限。我用这篇文章作为灵感:https://www.red-gate.com/simple-talk/sql/data-science-sql/sql-server-machine-learning-2019-working-with-security-changes/以下是我遵循的确切步骤。应用程序容器是在SQL Server MLS安装过程中创建的。它们是Windows本地目录中的对象,与本地目录中所有的对象一样,它们有一个唯一的SID来标识应用程序容器。

All Application Container对象在本地目录中有一个固定的SID,即S-1-15-2-1。您可以使用应用程序icacls授予权限。

  1. 以管理员身份打开命令提示符。

  2. 运行以下命令:

    icacls C:UsersamusaevaPyCharmProjectsARWWorkforceModel /grant *S-1-15-2-1:(OI)(CI)F /t

  3. 打开SQL Server配置管理器,选择"SQL Server服务"。找到"SQL Server启动板",右键单击并选择"重新启动"。

在这之后,我运行了我的代码,没有出现任何问题(我唯一需要更改的是斜杠-使用C:\Users\amusaeva\PyCharmProjects\ARW\WorkforceModel(。

最新更新