【问题标题】:Transforming source columns to create unique destination column in SSIS转换源列以在 SSIS 中创建唯一的目标列
【发布时间】:2015-06-04 17:49:58
【问题描述】:

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

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

即每列的前 5 个字符,如果有重复,则在末尾加上一个递增的数字。

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

Dest.Column
阿帕帕帕1
apapapap2
apapapap3
epepepep1
埃佩佩普2

这个包也是每周运行一次,所以向 SSIS OLEDB 源添加必要的列是行不通的。

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

【问题讨论】:

  • 你有什么问题?
  • 已编辑问题以供澄清。
  • 您可以在源或目标的 SQL 中执行此操作吗?在 SSIS 中这样做似乎没有必要。
  • 我还建议在从您的源读取的 SQL 语句中执行此操作。
  • 我想得越多,你似乎就越应该重新考虑这个要求。可能有一种更简单的方法可以实现本专栏的目的,除非您确实需要这些特定的信息序列。

标签: ssis


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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
    

    这不包括 left(,5) 但很容易添加。对于任何相同的 10 字符组合,它会添加一个数字,因此对于

    的输入

    abcdef, ghijkl
    abcdef, ghijkl
    abcdef, ghijkl
    lmnopq, rstuvw
    xyzabc, @987654
    xyzabc, defghi

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

    SQL 小提琴here.

    【讨论】:

    • 我认为问题在于会有增量加载,如果不止一次加载相同的 10 个字符的值(例如,apapapap),这会产生重复。
    • 这就是我的查询实现的 - 它添加了数字以保持它们的唯一性。我将添加一个 SQL Fiddle。
    • 这难道不是只有在每次加载时都选择全部源数据时才有效吗?如果您在第一周插入 abcdefghijkl,然后在第二周仅选择新数据并发现其中也包含 abcdefghijkl,则插入时您将收到唯一密钥违规错误。我认为当说对源查询的修改不起作用时,这是 OP 试图解释的问题。
    猜你喜欢
    • 2012-08-22
    • 2016-08-26
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多