派生列:从变量中加入2个数字

时间:2013-05-23 11:23:55

标签: ssis expression multicast derived

我必须输入没有给出月份的数据行。 它必须有一个月和一年。 在我的包中,我使用多播将其发送到12个派生列,我想添加年份和月份。 我认为这就像加入两个数字一样:

"2013" + "005" = 2013005

因为这一年必须是变量:

"Period" + "005" = Not Possible
"Period" + "Month5" = Not Possible

我缺少什么,有更好的方法吗?

一行的完整示例以及它应该如何获得:

1 702091    120 5   120_5   7650    638 M082    702091

应该成为

1 702091    120 5   120_5   7650    638 M082    702091 2013001
1 702091    120 5   120_5   7650    638 M082    702091 2013002
1 702091    120 5   120_5   7650    638 M082    702091 2013003
1 702091    120 5   120_5   7650    638 M082    702091 2013004
1 702091    120 5   120_5   7650    638 M082    702091 2013005
1 702091    120 5   120_5   7650    638 M082    702091 2013006
1 702091    120 5   120_5   7650    638 M082    702091 2013007
1 702091    120 5   120_5   7650    638 M082    702091 2013008
1 702091    120 5   120_5   7650    638 M082    702091 2013009
1 702091    120 5   120_5   7650    638 M082    702091 2013010
1 702091    120 5   120_5   7650    638 M082    702091 2013011
1 702091    120 5   120_5   7650    638 M082    702091 2013012

1 个答案:

答案 0 :(得分:1)

您有一个数据类型为int的SSIS变量。希望进行类似字符串的连接以将月数据附加到其中。

便宜的路线是将整数转换为字符串,连接您的值,然后转换回数字数据类型。不要那样做。使用SSIS表达式语言加上错误处理的机会不是很明显,而且效率非常低。

更好的途径是使用数学。您有2013您想要2013001...2013012以数学方式添加足够的零到2013年底,直到您的月份适合,然后定期添加。 2013 * 1000 + 1 ... 2013 * 1000 + 12

查询看起来像

SELECT
    BASE.year_number + MONTHS.month_number
FROM
    (
        SELECT 2013 * 1000
    ) BASE (year_number)
    CROSS JOIN
    (
        SELECT TOP 12
            ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n
        FROM
            information_schema.COLUMNS ISC  
    ) MONTHS(month_number);

在SSIS中,同样的概念将适用。添加派生列,将其命名为YearBase,对于值,它将为@[User::MyYearVariable] * 1000。现在,下游组件将能够访问“YearBase”列。

选项1

使用Multicast是将其拆分12次并将Dervied列添加到该输出。在这些派生列中,创建另一列ComputedYearMonth类型的int32,然后将公式设置为[YearBase] + 1 ... [YearBase] + 12

选项2

我很懒。我假设在选项1中的派生列之后,您可能会将所有这些行与union all一起重新组合。你可以做到这一点,但是数据流上大约有16个盒子比我想要维护的那么多。永远不要将脚本组件作为您选择的第一个工具,但对于这种情况,我可能会使用它。将Script Component拖到画布上并将其配置为在Asynchronous mode中运行,然后将上述逻辑推送到脚本中。