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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:00:05