如何在SSIS中实现类似Power BI的Fill-Up向上填充功能
SSIS脚本组件实现Fill-Up向上填充的调整方案
核心逻辑说明
你当前使用的逐行处理逻辑只能实现Fill-Down向下填充:顺着数据流顺序缓存上一个有效值,遇到空值就用前值填充。而Fill-Up向上填充需要用后出现的有效值填充前面的空值,无法在逐行读取的实时处理场景下直接实现,必须先把所有输入行缓存到内存集合,全部读取完成后倒序遍历处理,再输出结果。
前置配置调整
首先修改脚本组件的输入属性:
- 选中输入
Input0,将SynchronousInputID属性设置为None,改为异步输出模式,允许自定义输出行 - 新增输出
Output0,添加需要输出的所有列(和输入列字段匹配即可)
完整调整后代码
using System.Collections.Generic; // 类级别:定义缓存行数据的结构,需包含你需要处理的所有输入字段 private class BufferRow { public string Category { get; set; } public bool CategoryIsNull { get; set; } // 此处添加其他需要透传的字段,示例: public int RowId { get; set; } public decimal Amount { get; set; } } // 类级别:初始化缓存行的集合 private List<BufferRow> _rowCache = new List<BufferRow>(); // 逐行读取时仅做缓存,不处理不输出 public override void Input0_ProcessInputRow(Input0Buffer Row) { _rowCache.Add(new BufferRow { CategoryIsNull = Row.Category_IsNull, Category = Row.Category_IsNull ? null : Row.Category, // 对应填充其他透传字段 RowId = Row.RowId, Amount = Row.Amount }); } // 重写输入处理方法,等所有行读取完成后统一处理 public override void Input0_ProcessInput(Input0Buffer Buffer) { // 先读取所有输入行到缓存 while (Buffer.NextRow()) { Input0_ProcessInputRow(Buffer); } // 倒序遍历实现Fill-Up逻辑 string nextValidValue = string.Empty; // 如果末尾空值不需要填充为空,可以修改上面的初始默认值 for (int i = _rowCache.Count - 1; i >= 0; i--) { var current = _rowCache[i]; if (current.CategoryIsNull) { current.Category = nextValidValue; } else { nextValidValue = current.Category; } } // 正序输出所有处理完成的行 foreach (var row in _rowCache) { Output0Buffer.AddRow(); Output0Buffer.Category = row.Category; Output0Buffer.RowId = row.RowId; Output0Buffer.Amount = row.Amount; // 对应赋值其他输出字段 } }
注意事项
- 如果数据量超过百万级,全量内存缓存可能存在性能瓶颈,这种场景建议先给数据源添加行号排序字段,再用SQL自关联的方式实现Fill-Up,执行效率更高。
- 如果最后一行的目标字段为空,会用代码里
nextValidValue的初始值填充,可根据业务需求修改初始默认值。
内容的提问来源于stack exchange,提问作者Fahad
相关产品推荐
相关产品推荐

