如何在SSIS中通过Execute Process Task将Python输出映射到独立变量?
在SSIS中从Python脚本映射输出到多个独立用户变量的方法
现有临时方案说明
你当前采用的合并字符串再通过|分割的方法,在变量值不含分隔符的场景下是可行的,但存在结构不够清晰、若变量值包含|会导致解析失败的风险。
更结构化的解决方案:JSON输出+SSIS脚本任务解析
通过让Python输出JSON格式的结构化数据,再在SSIS中用脚本任务解析到独立变量,是更可靠的方法:
1. 修改Python脚本输出JSON
把原脚本改成输出标准JSON字符串,确保结构明确:
import json if __name__ == "__main__": # 定义要输出的变量集合 output_vars = { "user_ssis_variable1": "Let's", "user_ssis_variable2": "get", "user_ssis_variable3": "ready", "user_ssis_variable4": "to rumble!" } # 输出JSON字符串(确保无多余print,只输出这一行核心数据) print(json.dumps(output_vars))
2. SSIS端配置步骤
- 保持Execute Process Task的配置,将Python的标准输出捕获到一个字符串变量(比如
User::Python_Json_Output) - 添加一个Script Task:
- 设置ReadOnlyVariables为
User::Python_Json_Output - 设置ReadWriteVariables为
User::user_ssis_variable1,User::user_ssis_variable2,User::user_ssis_variable3,User::user_ssis_variable4 - 在脚本任务中编写解析代码(以C#为例):
using System; using Microsoft.SqlServer.Dts.Runtime; using System.Text.Json; namespace ST_ScriptTaskJsonParser { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { public void Main() { try { string jsonStr = Dts.Variables["User::Python_Json_Output"].Value.ToString(); var jsonDoc = JsonDocument.Parse(jsonStr); var root = jsonDoc.RootElement; // 将JSON中的值映射到对应SSIS变量 Dts.Variables["User::user_ssis_variable1"].Value = root.GetProperty("user_ssis_variable1").GetString(); Dts.Variables["User::user_ssis_variable2"].Value = root.GetProperty("user_ssis_variable2").GetString(); Dts.Variables["User::user_ssis_variable3"].Value = root.GetProperty("user_ssis_variable3").GetString(); Dts.Variables["User::user_ssis_variable4"].Value = root.GetProperty("user_ssis_variable4").GetString(); Dts.TaskResult = (int)ScriptResults.Success; } catch (Exception ex) { // 捕获异常并标记任务失败 Dts.Events.FireError(0, "JSON解析失败", ex.Message, string.Empty, 0); Dts.TaskResult = (int)ScriptResults.Failure; } } enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure }; } }
- 设置ReadOnlyVariables为
方案对比与最优性确认
- 如果你的变量值绝对不会包含分隔符
|,且变量数量少,临时的分割方案是最简洁的,无需额外依赖和代码编写。 - 如果变量值可能包含特殊字符、变量数量多或结构复杂,JSON解析的方法更健壮、易维护,是更优的结构化方案。
内容的提问来源于stack exchange,提问作者ashap551
相关产品推荐
相关产品推荐

