SSIS中用C#脚本将System.Object变量转为List<String>并取最大值
解决SSIS中System.Object转List并提取最大值的问题
我来帮你搞定这个SSIS脚本的问题——把System.Object类型的文件名列表转成List
1. 配置脚本任务的变量权限
打开脚本任务编辑器,在脚本选项卡的ReadOnlyVariables中添加User::FilesNamesList,在ReadWriteVariables中添加你要存储最大值的目标变量(比如User::MaxFileName)。注意变量名称要和包中的完全一致,SSIS对变量名的大小写是敏感的。
2. 编写C#脚本逻辑
点击编辑脚本进入Visual Studio Tools for Applications (VSTA),替换默认代码为以下内容:
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using Microsoft.SqlServer.Dts.Runtime; namespace ST_XXXXXXXXX // 保留脚本任务自动生成的命名空间即可 { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { public void Main() { try { // 获取System.Object类型的文件名列表变量 object fileNameObj = Dts.Variables["User::FilesNamesList"].Value; List<string> fileNameList = new List<string>(); // 判断变量实际类型并转换为List<string> // 情况1:Cozy Roc任务返回的是ArrayList(直接存储文件名集合) if (fileNameObj is ArrayList arrayList) { fileNameList = arrayList.Cast<string>().ToList(); } // 情况2:Cozy Roc任务返回的是DataTable(包含FileName列的结果表) else if (fileNameObj is DataTable dt) { fileNameList = dt.AsEnumerable() .Select(row => row["FileName"].ToString()) .ToList(); } // 其他未知类型的处理 else { Dts.Events.FireError(0, "类型转换失败", $"无法将{fileNameObj.GetType().Name}类型转换为List<string>", string.Empty, 0); Dts.TaskResult = (int)DTSExecResult.Failure; return; } // 提取最大值(按字符串字典序排序,需自定义逻辑可修改此处) string maxFileName = fileNameList.Count > 0 ? fileNameList.Max() : string.Empty; // 将最大值赋值给目标包变量 Dts.Variables["User::MaxFileName"].Value = maxFileName; // 标记任务成功 Dts.TaskResult = (int)DTSExecResult.Success; } catch (Exception ex) { // 捕获异常并触发SSIS错误事件 Dts.Events.FireError(0, "脚本执行异常", ex.Message, string.Empty, 0); Dts.TaskResult = (int)DTSExecResult.Failure; } } } }
3. 关键注意点
- 类型匹配:Cozy Roc的SFTP List Files任务通常返回包含
FileName列的DataTable(具体列名可在任务配置中确认),所以优先用DataTable的处理逻辑;如果你的任务直接返回文件名的ArrayList集合,对应第一种情况。 - 最大值逻辑:
List<string>.Max()默认按字符串字典序取最大值,如果文件名包含日期、数字等特殊规则,可替换为自定义排序逻辑,比如fileNameList.OrderByDescending(f => f, StringComparer.Ordinal).FirstOrDefault()。 - 异常排查:脚本中添加了try-catch块,执行出错时会触发SSIS的错误事件,便于你在日志中定位问题。
内容的提问来源于stack exchange,提问作者Stevo
相关产品推荐
相关产品推荐

