连接SSIS中多行的值

时间:2013-06-14 16:55:13

标签: ssis

我有一个文件来源,数据如下所示:

ID BarcodeNumber
------------------------
1  123456789    
1  33    
2  987654321    
2  44

我想获得如下数据:

ID BarcodeNumber
------------------------
1  12345678933    
2  98765432144

有关如何完成此任务的任何建议?

编辑:我想在数据流中这样做,因为这可能有数十亿行。

2 个答案:

答案 0 :(得分:6)

所需的状态是,对于每个ID,所有条形码将连接在一起。

要完成此操作,您的数据必须按ID排序。如果文件尚未排序,则您需要通过排序任务运行它。

对数据进行排序后,您需要在Asynchronous mode中添加脚本转换。它将是异步的,因为行数不会与行数相同。

psuedo代码将类似于

If Row.ID <> LastID
    If LastID <> ""
        Output0Buffer.ID = LastID
        Output0Buffer.Barcodes = Barcodes
    LastID = Row.ID
    Barcodes = ""

Barcodes = Barcodes + Row.Barcodes

注意事项

  • 上面的代码既不是C#也不是VB.NET,但逻辑应该是声音
  • 如果你有数十亿行,那么这台机器上需要一些严重的RAM,因为SSIS是一个内存转换系统。
  • 排序操作和此脚本任务将变得缓慢且占用大量内存,因为它们无法重复使用内存空间

答案 1 :(得分:4)

Data flow

源文件:

ID,RowNum,Barcode   
1,1,123456789  
1,2,33    
2,1,987654321    
2,2,44

拆分文件的行。对于此处源文件中假设的简单情况,我们可以使用条件拆分。对于更复杂的情况,我们可以使用Script组件作为拆分器。从这里开始,解决方案将是非常标准的排序和合并。合并后,添加一个派生列:TRIM(Barcode1)+ TRIM(Barcode2),其中Barcode1来自&#34;左侧&#34;其中包含RowNum 1行,而#34;右侧&#34;表示Barcode2。如果您担心排序组件的性能,请将拆分行放入两个表中,并比较性能。

Cond. Split: RowNum1 (RowNum == "1"), RowNum2 (RowNum == "2")
Sort: By ID; Pass through: Barcode
Merge Join: Left outer join, Join key: ID; Output: ID, Barcode1 and Barcode2
Derived column: TRIM(Barcode1) + TRIM(Barcode2)