You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSIS中用C#脚本将System.Object变量转为List<String>并取最大值

解决SSIS中System.Object转List并提取最大值的问题

我来帮你搞定这个SSIS脚本的问题——把System.Object类型的文件名列表转成List并提取最大值,针对你用Cozy Roc SFTP任务的场景,步骤其实很清晰,下面一步步来:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:49:10