转换源列以在SSIS中创建唯一的目标列
我一直在构建一个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
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试图解释的问题,当他说对源查询的修改不起作用时。