0

我必须输入没有给出月份的数据行。它必须有一个月和一年。在我的包中,我使用多播将其发送到 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
4

1 回答 1

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 个。永远不要将脚本组件作为您选择的第一个工具,但在这种情况下,我可能会使用它。将 aScript Component拖到画布上并将其配置为在异步模式下运行,然后将上述逻辑推送到脚本中。

于 2013-05-23T15:01:40.357 回答