为啥我不能为 SQL Server 2019 创建外部语言?

Posted

技术标签:

【中文标题】为啥我不能为 SQL Server 2019 创建外部语言?【英文标题】:Why can't I create an EXTERNAL LANGUAGE for SQL Server 2019?为什么我不能为 SQL Server 2019 创建外部语言? 【发布时间】:2021-10-15 07:35:44 【问题描述】:

我正在尝试了解我在 SQL Server 2019 中的外部语言设置有什么问题。

我无法使用我的语言“Test1”执行任何语句,该语言被设计为一种额外的 Python 外部语言。我的目标是拥有多个 Python 外部语言,这样我就可以为每个拥有单独的库,从而模拟虚拟环境。

我失败的脚本是:

EXEC sp_execute_external_script
@language =N'TEST1',
@script=N'
import pandas as pd
import sys
df = pd.DataFrame("Version": sys.path + [ sys.executable ])
OutputDataSet = df'
WITH RESULT SETS (([Version] nvarchar(256)));

此脚本使用 SQL Server 2019 机器学习服务提供的“Python”语言执行得很好。

我的(无用的)错误消息是:

消息 39004,第 16 级,状态 20,第 87 行 执行“sp_execute_external_script”期间发生“TEST1”脚本错误,HRESULT 为 0x80004004。

完成时间:2021-08-11T16:32:50.5880126-04:00

我的设置是:

-- "Ensure that Machine Learning Services and Language Extensions are installed"
EXEC sp_configure 'external scripts enabled', 1
RECONFIGURE WITH OVERRIDE;
GO

IF EXISTS(SELECT TOP 1 1 FROM sys.external_languages L WHERE L.language = 'TEST1')
BEGIN
    DROP EXTERNAL LANGUAGE TEST1
END
GO

-- From: https://github.com/microsoft/sql-server-language-extensions/releases/tag/Python-v1.1.0
CREATE EXTERNAL LANGUAGE TEST1 
FROM (CONTENT = N'C:\LanguageExtensions\python-lang-extension-windows-release.zip', FILE_NAME = 'pythonextension.dll');
GO

C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\ExtensibilityLog 处的错误日志说:

2021-08-11 16:32:50.349 启动进程 exthost.exe 成功!

2021-08-11 16:32:50.581 清理会话 ID 9D7958AD-7EC2-48B4-B7E2-0D48D35DA2B5 的上下文 2021-08-11 16:32:50.581 无法删除目录 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData\Appcontainer1\9D7958AD-7EC2-48B4-B7E2-0D48D35DA2B5 与 HR 0x80070020。

2021-08-11 16:32:50.581 无法删除目录 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData\Appcontainer1\26635237-9710-4B29-9233-5E72D1AA8204\Trace 中的文件与 HR 0x80070020。

2021-08-11 16:32:50.581 无法删除目录 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData\Appcontainer1\26635237-9710-4B29-9233-5E72D1AA8204\Trace with HR 0x80070091.

2021-08-11 16:32:50.581 无法删除目录 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData\Appcontainer1\26635237-9710-4B29-9233-5E72D1AA8204\Packages with HR 0x80070091.

2021-08-11 16:32:50.581 无法删除目录 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData\Appcontainer1\FA7BEFC1-F529-43DB-B5D6-68F32EF94BB8,HR 为 0x80070020。

2021-08-11 16:32:50.581 无法删除目录 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData\Appcontainer1\F401FD5A-8563-4361-BCBD-04570C1F6FA0,HR 为 0x80070020。

2021-08-11 16:32:50.581 无法删除目录 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData\Appcontainer1\C83DDF61-F6E5-431B-9A2B-EC4EF545D506,HR 为 0x80070020。

2021-08-11 16:32:50.581 无法删除目录 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData\Appcontainer1\685BE366-D4FE-4C91-83CC-DE1F04AC1FEB,HR 0x80070020。

2021-08-11 16:32:50.581 无法删除目录 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData\Appcontainer1\26635237-9710-4B29-9233-5E72D1AA8204,HR 为 0x80070020。

我尝试过的事情:

我 BCP 将 external_language_file CONTENT varbinary 输出到磁盘,以确认它获得了正确的文件并且它具有正确的内容。如果你想试试这个,你还需要创建一个 .fmt 文件来确保没有前导字节。

我在 rlauncher.config 中关闭了清理并将 TRACE 级别设置为 4,以便更好地报告错误

我授予C:\ProgramData\MSSQLSERVER\Temp-PYC:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\ExtensibilityData 下的AppContainer0、1、2 对“所有应用程序包”和“MSSQLLaunchpad”的完全控制权

我将C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\PYTHON_SERVICES 放在系统路径上

有什么想法吗?我觉得支持另一种 Python 语言应该很简单。

C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\PYTHON_SERVICES 提供的语言版本可能与https://github.com/microsoft/sql-server-language-extensions/releases/tag/Python-v1.1.0 的预期不符?

【问题讨论】:

【参考方案1】:
    确保您已安装 CU3+。 确保以 PYTHON_SERVICES 结尾的路径在系统 PATH 上,并且也是 PYTHONHOME 和 PYTHONPATH 的值。如果您安装了其他 python,这显然会破坏其他东西,因此您可能希望对 CREATE EXTERNAL LANGUAGE 命令使用 ENVIRONMENT_VARIABLES 参数,而不是设置这些系统范围。 我不为此解决方案承担风险或责任。使用风险自负。

【讨论】:

以上是关于为啥我不能为 SQL Server 2019 创建外部语言?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SQL Server 2019 与 Azure SQL 数据库中的外部表语法不同? `

为啥我不能将 SQL Server 连接到我的节点 js

为啥我不能在 VS2019 中为对话框添加 Class?

SQL Server 创建错误的表名,为啥?

请教sql server agent 为啥不能启动?

为啥我不能在我的 SQL Server 上查询 OFFSET/FETCH 查询?