如何在SSIS包中为ID与PropertyID重复的记录添加增量编号
这是个在SSIS里很常见的需求,我给你两种实用的实现方案,你可以根据数据源类型来选:
方案1:直接在SQL数据源中处理(推荐,如果数据来自数据库)
如果你的源数据来自关系型数据库(比如SQL Server),最简便高效的方式是在查询源数据时直接用窗口函数生成RID,不需要在SSIS数据流里额外处理。
你可以用ROW_NUMBER()函数,按ID和PropertyID分区,再按你需要的顺序(比如例子里的Value)排序,就能自动生成递增的RID:
SELECT ID, Name, PropertyID, Value, -- 按ID+PropertyID分组,每组内按Value排序生成序号 ROW_NUMBER() OVER (PARTITION BY ID, PropertyID ORDER BY Value) AS RID FROM YourSourceTable
这样查询出来的结果直接就是你想要的格式,后续在SSIS里直接用这个结果集就行。
方案2:用SSIS脚本组件处理(适用于非数据库数据源)
如果你的数据来自Excel、CSV这类非数据库源,或者必须在SSIS数据流中处理,那可以用脚本组件来实现:
- 在Data Flow任务里,把Merge Join的输出连接到一个脚本组件(选择「转换」类型)
- 打开脚本编辑器,在「输入列」里勾选
ID、PropertyID、Value这些需要用到的列 - 在「输出列」里添加一个新列,命名为
RID,数据类型选择int - 切换到「脚本」选项卡,点击「编辑脚本」,用C#编写以下逻辑:
using System; using System.Data; using Microsoft.SqlServer.Dts.Pipeline.Wrapper; using Microsoft.SqlServer.Dts.Runtime.Wrapper; using System.Collections.Generic; using System.Tuple; [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] public class ScriptMain : UserComponent { // 存储每个(ID, PropertyID)组合的当前计数 private Dictionary<Tuple<int, int>, int> _ridCounter = new Dictionary<Tuple<int, int>, int>(); public override void Input0_ProcessInputRow(Input0Buffer Row) { // 创建当前行的分组键 var groupKey = Tuple.Create(Row.ID, Row.PropertyID); // 更新计数:如果是该分组的第一条记录,初始化为1;否则计数+1 if (!_ridCounter.ContainsKey(groupKey)) { _ridCounter[groupKey] = 1; } else { _ridCounter[groupKey]++; } // 给RID列赋值 Row.RID = _ridCounter[groupKey]; } // 处理完一批数据后清空字典,避免内存占用过高 public override void PostExecute() { base.PostExecute(); _ridCounter.Clear(); } }
注意事项:
- 如果需要RID的顺序和你例子里完全一致(比如按
Value从小到大排序),建议在Merge Join之后先添加一个排序组件,按ID、PropertyID、Value排序,再进入脚本组件。 - 脚本组件里的字典会在数据流运行期间保持状态,
PostExecute方法里清空字典是为了避免处理大量数据时内存泄漏。
内容的提问来源于stack exchange,提问作者Ranjith Varatharajan
相关产品推荐
相关产品推荐

