我必须输入没有给出月份的数据行。 它必须有一个月和一年。 在我的包中,我使用多播将其发送到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
答案 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”列。
使用Multicast是将其拆分12次并将Dervied列添加到该输出。在这些派生列中,创建另一列ComputedYearMonth
类型的int32,然后将公式设置为[YearBase] + 1
... [YearBase] + 12
。
我很懒。我假设在选项1中的派生列之后,您可能会将所有这些行与union all一起重新组合。你可以做到这一点,但是数据流上大约有16个盒子比我想要维护的那么多。永远不要将脚本组件作为您选择的第一个工具,但对于这种情况,我可能会使用它。将Script Component
拖到画布上并将其配置为在Asynchronous mode中运行,然后将上述逻辑推送到脚本中。