如何将SSIS中的变量值传递给Python脚本:执行处理任务

问题描述 投票:0回答:1

我有一个执行 python 脚本的执行进程任务

我想从 SSIS 传递 python 中的根变量值,当我在 Python 脚本中给出项目参数值时,它会抛出错误,我该怎么做?

python ssis sql-server-data-tools ssis-2012 msbi
1个回答
0
投票

正如您在屏幕截图中所示,

root = $Project::NewIngestionPath;

这不会是正确的 python,因为我们在那里不使用分号。 Python 引擎也不知道如何使用

$Project::NewIngestionPath
,因为这是 SSIS 的事情。

您缺少的部分在您的第一张图片中:

Arguments

执行进程任务接受被调用进程的参数。现在运行时,它类似于

cd C:\Python
"C:\Program Files\Python310\python.exe" C:\Python\Pre_Ingestion_Fix_Script.py

您想要做的是添加另一个参数

"C:\Program Files\Python310\python.exe" C:\Python\Pre_Ingestion_Fix_Script.py \\server\path\to\new\ingestion

由于一些原因,这变得很棘手。首先,当涉及空格时,DOS 命令参数会变得很奇怪,因为传统上空格被解释为下一个参数。有些工具在调用 CMD.exe 时只能注入一组双引号参数,老实说我不记得 SSIS 在这种情况下是如何工作的。进一步搅浑水的是,我们为执行流程任务提供了

Arguments
选项,或者您也可以使用
StandardInputVariable
。您可以通过使用“执行流程任务”上的“表达式”选项卡提供所需的值来使事情变得更加复杂。

我会在 SSIS 中创建一个名为

CommandArguments
的 String 类型变量。在变量的表达式部分,我将使用以下内容

"C:\Python\Pre_Ingestion_Fix_Script.py " + $Project::NewIngestionPath

结果值将类似于

C:\Python\Pre_Ingestion_Fix_Script.py \server\路径 o ew\摄入

您可以在执行流程任务上放置一个断点,并目视检查

@[User::CommandArguments]
的值,它们看起来正确吗?它们应该与变量的设计时值相同,但这很重要,因为我们将在任务上使用表达式,并且没有机会检查表达的值,它是隐藏的。

在最佳情况下,您可以简单地删除 Arguments 中的内容,然后在 StandardInputVariable 的下拉框中选择我们的 CommandArguments。运行该包并查看它是否按预期工作。您的 python 包应该有一些日志记录,以便您可以检查命令行参数的结果。

如果失败,则从 StandardInputVariable 中删除该变量,然后单击“表达式”选项卡。将我们的变量连接到 Arguments 并再次运行包,它有效吗

其中一个应该,我只是不能肯定地说,因为还有很多其他地方可能会出错(权限、项目参数的实际值等),但这就是将项目参数传递到调用中的方式一个 python 文件。

Python 特有的部分

最后,

root = $Project::NewIngestionPath

不起作用,因此我们需要调整脚本以访问运行时提供的参数。这是我们的朋友 sys.argv

import sys
root = sys.argv[1]
# rest of code here
© www.soinside.com 2019 - 2024. All rights reserved.