SSIS中C#转换脚本:替代多else if的层级判断方案
嘿,这个需求太有共鸣了!一堆嵌套的else if不仅写着麻烦,后期要调整优先级或者增减字段时更是噩梦。给你两个在SSIS C#脚本转换里能直接用的优雅方案,完美替代冗余的条件判断:
方案1:用优先级列表+LINQ遍历(最直观)
核心思路是把每个decimal值和对应的来源标签按预设顺序打包成一个列表,然后用LINQ快速定位第一个非空的项,代码简洁还容易维护。
// 先把SSIS输入列的值取出来(根据你的实际列名替换) decimal? mmValue = Row.MM; decimal? preValue = Row.PRE; decimal? ddValue = Row.DD; decimal? ptValue = Row.PT; decimal? otherValue = Row.Other; // 替换成你第五个字段的实际名称 // 按优先级顺序创建「值+标签」的配对列表 var priorityPairs = new List<(decimal? Value, string SourceLabel)> { (mmValue, "MM"), (preValue, "PRE"), (ddValue, "DD"), (ptValue, "PT"), (otherValue, "OTHER") // 对应第五个字段的标签 }; // 找到第一个非空的有效项 var firstValidItem = priorityPairs.FirstOrDefault(item => item.Value.HasValue); // 给SSIS输出列赋值 if (firstValidItem.Value.HasValue) { Row.FinalValue = firstValidItem.Value.Value; // 你的decimal类型输出列 Row.ValueSource = firstValidItem.SourceLabel; // 你的varchar类型标签列 } else { // 处理所有值都为空的边界情况,按需求调整 Row.FinalValue = null; Row.ValueSource = "NO_VALID_DATA"; }
这个方案的好处太明显了:
- 优先级顺序一眼就能看明白,要调整顺序直接改列表的排列就行
- 新增或删除字段时,只需要在列表里加/减一行,不用改一堆条件判断
- LINQ的写法逻辑清晰,比堆else if可读性高10倍
方案2:封装成可复用方法(适合多脚本共享逻辑)
如果这个取数逻辑在多个SSIS脚本转换里都要用,把它封装成一个私有方法,调用起来更简洁:
// 在脚本类里定义一个私有方法 private (decimal? ValidValue, string SourceTag) GetFirstValid(params (decimal? Value, string Tag)[] valueTagPairs) { return valueTagPairs.FirstOrDefault(pair => pair.Value.HasValue); } // 然后在主逻辑里调用 var result = GetFirstValid( (Row.MM, "MM"), (Row.PRE, "PRE"), (Row.DD, "DD"), (Row.PT, "PT"), (Row.Other, "OTHER") ); // 赋值逻辑和方案1一致 Row.FinalValue = result.ValidValue ?? null; Row.ValueSource = result.SourceTag ?? "NO_VALID_DATA";
小提醒
- 确保你的SSIS输入列是允许为空的decimal类型,如果列设置为非空,那要改成判断是否为业务上的空值(比如0),不过按你的需求应该是处理数据库null,所以列的可空属性要开对
- 所有值都为空的情况一定要处理,避免输出列出现意外的默认值
内容的提问来源于stack exchange,提问作者user3494110
相关产品推荐
相关产品推荐

