转换源列以在SSIS中创建唯一目标列

时间:2015-06-04 17:49:59

标签: ssis

我一直在构建一个SSIS包,它使用不同的模式在两个数据库之间传输数据。在目标数据库中,一列具有唯一键约束,并且需要从2个源数据库列填充数据,如:

SELECT (LOWER(LEFT(Col1.Column1, 5)) + LOWER(LEFT(Col1.Column2, 5)))

即。每列的前5个字符,如果有重复,则加上最后的递增数字。

递增数字必须取决于前10个字符,因此每个不同的变体都有自己的递增数字。例如:

Dest.Column
apapapap1
apapapap2
apapapap3
epepepep1
epepepep2

此软件包也每周运行一次,因此向SSIS OLEDB源添加必要的列将不起作用。

所以我的问题是:是否有可能在写入目标数据库之前在SSIS中执行此转换,如果是,如何?

2 个答案:

答案 0 :(得分:0)

假设您正在使用SQL Server,您可以使用partition by在源SQL语句中执行此操作,例如:

select 
    C.Column1 + C.Column2 + 
        case 
            when (select count(1) from Col1 C1 where C1.Column1 = C.Column1 and C1.Column2 = C.Column2) > 1 then 
                cast(row_number() over (partition by C.Column1 + C.Column2 order by C.Column1, C.Column2) as varchar) 
            else 
                '' 
            end
from 
    Col1 C

这不包括左(,5),但添加起来很简单。对于任何相同的10-char组合,它会添加一个数字,因此对于

的输入

abcdefghijkl
abcdefghijkl
abcdefghijkl
lmnopqrstuvw
xyzabcdefghi
xyzabcdefghi

...你得到: abcdefghijkl1 abcdefghijkl2 abcdefghijkl3 lmnopqrstuvw xyzabcdefghi1 xyzabcdefghi2

SQL小提琴here

答案 1 :(得分:0)

使用自定义查询执行此操作将是此处的首选选项,但如果您必须在SSIS中执行此操作,则可以尝试在SSIS中生成2列,其中一列附加源中的两列( source1 < / em>),以及另一个包含目的地的这些组合(删除号码后)( dest1 )。然后,您可以配置查找块并计算与 source1 中每个条目对应的 dest1 列中的条目数,并将(此数字+1)附加到< EM> source1中