SSIS如何将遍历获取的文件名列表存入Object类型变量
SSIS遍历文件名填充Object类型变量实现方案
不需要额外第三方工具,直接用SSIS自带的脚本任务(Script Task) 就能实现,具体操作流程如下:
前置校验
先确认现有配置符合要求:
- Foreach Loop Container已选用Foreach File Enumerator,勾选「名称和扩展名」检索选项,变量映射页已正确绑定字符串类型的
filename变量接收单轮遍历的文件名 - 已创建Object数据类型的
filenamelist变量,变量作用域覆盖Foreach循环容器及后续取值流程 - (可选)如果最终要直接使用逗号分隔的字符串结果,可以额外创建一个字符串类型的变量存储最终拼接值
操作步骤
- 打开Foreach Loop Container,在容器内部拖入一个脚本任务,放置在循环内业务逻辑的最前端即可。
- 双击打开脚本任务编辑器,在脚本配置页:
- ReadOnlyVariables项勾选已有的
User::filename变量 - ReadWriteVariables项勾选创建好的
User::filenamelist变量 - 选择你熟悉的脚本语言(推荐C#),点击「编辑脚本」进入代码编辑界面
- ReadOnlyVariables项勾选已有的
- 在脚本的
Main方法中写入如下逻辑:核心是首次循环时初始化字符串列表存入Object变量,后续每轮循环将当前遍历到的文件名追加到列表中,再回写到Object变量。
public void Main() { // 读取当前轮次遍历到的文件名,因已配置仅返回名称+扩展名,无需额外截取路径 string currentFileName = Dts.Variables["User::filename"].Value.ToString(); List<string> fileNameCollection; // 首次循环时Object变量为空,初始化列表 if (Dts.Variables["User::filenamelist"].Value == null) { fileNameCollection = new List<string>(); } else { // 非首次循环直接读取已存的列表 fileNameCollection = (List<string>)Dts.Variables["User::filenamelist"].Value; } // 追加当前文件名到列表 fileNameCollection.Add(currentFileName); // 将更新后的列表回写到Object类型变量 Dts.Variables["User::filenamelist"].Value = fileNameCollection; Dts.TaskResult = (int)ScriptResults.Success; }
- 若要得到
abc.csv, azd.csv, ...格式的逗号分隔字符串,在Foreach Loop Container外部再加一个脚本任务,读取filenamelist中存储的列表,用string.Join(", ", fileNameCollection)方法拼接成目标格式字符串即可,既可以存回字符串变量供后续流程调用,也可以直接输出验证。
避坑提示:如果不想存列表、想直接在循环里拼接逗号分隔字符串,一定要在首次循环时判断字符串变量是否为空,非空时先加分隔符再追加新文件名,避免出现开头多余逗号、文件名之间无分隔符的格式问题。
内容的提问来源于stack exchange,提问作者gwc
相关产品推荐
相关产品推荐

