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

转换源列以在SSIS中创建唯一的目标列,ssis,Ssis,我一直在构建一个SSIS包,该包在具有不同模式的两个数据库之间传输数据。在目标数据库中,一列具有唯一键约束,需要从两个源数据库列填充数据,如: SELECT (LOWER(LEFT(Col1.Column1, 5)) + LOWER(LEFT(Col1.Column2, 5))) i、 e.每列的前5个字符,如果有重复,则在末尾加上递增的数字 递增数字必须取决于前10个字符,因此每个不同的变体都有自己的递增数字。例: 目标列 apapapap1 apapapap2 APAPAP3 EP1 EP

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

SELECT (LOWER(LEFT(Col1.Column1, 5)) + LOWER(LEFT(Col1.Column2, 5)))
i、 e.每列的前5个字符,如果有重复,则在末尾加上递增的数字

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

目标列
apapapap1
apapapap2
APAPAP3
EP1
EP2

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


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

假设您使用的是SQL Server,您可以在源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字符组合,它会添加一个数字,因此对于

abcdef
ghijkl

abcdef
ghijkl

abcdef
ghijkl

lmnopq
rstuvw

xyzabc
defghi

xyzabc
defghi

…你会得到:

abcdefghijkl1
abcdefghijkl2
abcdefghijkl3
lmnopqrstuv
xyzabcdefghi1
xyzabcdefghi2


SQL FIDLE。

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

您的问题是什么?编辑问题以进行澄清。您可以在源或目标SQL中执行此操作吗?在SSIS中这样做似乎是不必要的。我还建议在从源代码读取的SQL语句中这样做。我越是考虑这一点,您就越应该重新考虑这一要求。可能有一种更简单的方法来实现本专栏的目的,除非您真的需要这一特定的信息序列。我认为问题是会有增量加载,如果相同的10个字符的值(例如apapap),这将创建重复我的查询实现了这一点——它添加数字以保持它们的唯一性。我将添加一个SQL FIDLE。但是,只有在每次加载时选择全部源数据时,这难道不起作用吗?如果在第一周插入abcdefghijkl,然后在第二周仅选择新数据并发现其中也包含abcdefghijkl,则插入时将收到唯一的密钥冲突错误。我认为这就是OP试图解释的问题,当他说对源查询的修改不起作用时。