在SSIS中处理Excel非结构化数据:合并单元格填充需求
解决SSIS中Excel合并单元格拆分后NULL值填充问题
针对Excel合并单元格导入SSIS后出现NULL值的问题,提供两种可行的解决方案:
方案一:导入SQL后用T-SQL修复数据
直接在源表tbl_e1上执行T-SQL语句,一次性完成所有填充需求:
- 填充ID=1的Dept2列
UPDATE tbl_e1 SET Dept2 = Dept1 WHERE ID = 1;
- 向前填充Dept2列的垂直合并NULL值
使用CTE结合窗口函数,将上一行非NULL的Dept2值填充到当前NULL行:
WITH Dept2_Fill AS ( SELECT ID, Dept2, LAST_VALUE(Dept2) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Filled_Dept2 FROM tbl_e1 ) UPDATE Dept2_Fill SET Dept2 = Filled_Dept2 WHERE Dept2 IS NULL;
- 向前填充Value列的垂直合并NULL值
同理处理Value列:
WITH Value_Fill AS ( SELECT ID, Value, LAST_VALUE(Value) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Filled_Value FROM tbl_e1 ) UPDATE Value_Fill SET Value = Filled_Value WHERE Value IS NULL;
执行完成后,将tbl_e1的数据插入到目标表tbl_e2即可。
方案二:SSIS数据流中用脚本组件实时处理
如果需要在数据流中直接处理,使用**脚本组件(转换)**而非控制流的脚本任务,步骤如下:
- 在数据流中添加脚本组件,选择“转换”类型,输入列勾选
ID, Name, Dept1, Dept2, Value。 - 在脚本编辑器中,声明两个变量用于保存上一行的非NULL值:
private string lastDept2; private int? lastValue;
- 重写
PreExecute方法初始化变量:
public override void PreExecute() { base.PreExecute(); lastDept2 = string.Empty; lastValue = null; }
- 重写
ProcessInputRow方法,处理每行数据:
public override void Input0_ProcessInputRow(Input0Buffer Row) { // 处理ID=1的Dept2填充 if (Row.ID == 1 && Row.Dept2_IsNull) { Row.Dept2 = Row.Dept1; } // 处理Dept2的向前填充 if (!Row.Dept2_IsNull) { lastDept2 = Row.Dept2; } else { Row.Dept2 = lastDept2; } // 处理Value的向前填充 if (!Row.Value_IsNull) { lastValue = Row.Value; } else { if (lastValue.HasValue) { Row.Value = lastValue.Value; } } }
- 配置完成后,将脚本组件的输出连接到目标表
tbl_e2的导入组件。
注意事项
- 使用T-SQL方案时,确保
ID列是按Excel源的行顺序排序的,否则向前填充会出错。 - SSIS脚本组件方案中,要确保数据流是按ID顺序处理的,避免乱序导致填充错误。
内容的提问来源于stack exchange,提问作者Klaus Mikaelson
相关产品推荐
相关产品推荐

