【问题标题】:SSIS For Loop - Increment 'YYYYMM' by Month in LoopSSIS For Loop - 在循环中按月递增“YYYYMM”
【发布时间】:2019-11-21 22:44:51
【问题描述】:

我正在尝试执行一个 for 循环,该循环以“201812”之类的格式传递开始日期,并将增量增加到“201903”的结束日期(例如)。变量作为整数传递给存储的过程,然后根据这些值抓取和插入数据。我试图实现这里找到的模式,但它似乎没有正确递增:

SSIS For Loop Container with Date Variable

我已经设置了如下变量:

ETLBeginPeriod 和 ETLEndPeriod 在此处的执行 SQL 任务中设置:

然后是 For 循环中的表达式

AssignExpression 中的完整表达式是

@[User::Counter] = LEFT((DT_WSTR,19)(DATEADD("mm",1,(DT_DBDATE)(LEFT((DT_WSTR, 10) (@[User::Counter]),4) + "-" + RIGHT((DT_WSTR, 10) (@[User::Counter]),2) + "-" + "01"))),4) + SUBSTRING((DT_WSTR,19)(DATEADD("mm",1,(DT_DBDATE)(LEFT((DT_WSTR, 10) (@[User::Counter]),4) + "-" + RIGHT((DT_WSTR, 10) (@[User::Counter]),2) + "-" + "01"))),6,2)

在测试 AssignExpression 时,表达式本身确实返回了一个正确的值(即,它会将 201808 更改为 201809,但这似乎没有受到影响。它会得到正确的初始传递的值并运行201808,然后使用201808 重试。所以它似乎没有改变计数器值。

【问题讨论】:

  • 您必须将解决方案写成单独的答案,而不是添加到问题中

标签: sql-server for-loop ssis expression etl


【解决方案1】:

我认为主要问题是您忘记将整个结果转换为整数。尝试使用以下表达式:

@[User::Counter] = (DT_I4)(LEFT((DT_WSTR,19)(DATEADD("mm",1,(DT_DBDATE)(LEFT((DT_WSTR, 10) (@[User::Counter]),4) + "-" + RIGHT((DT_WSTR, 10) (@[User::Counter]),2) + "-" + "01"))),4) + SUBSTRING((DT_WSTR,19)(DATEADD("mm",1,(DT_DBDATE)(LEFT((DT_WSTR, 10) (@[User::Counter]),4) + "-" + RIGHT((DT_WSTR, 10) (@[User::Counter]),2) + "-" + "01"))),6,2))

【讨论】:

  • 这似乎不是问题。它似乎以“201908”开始正确,然后重试“201908”。
【解决方案2】:

我想通了——我决定添加一个脚本任务来查看变量,结果发现它们正确递增,但是我分配了错误的变量来传递给存储过程。我最初一直在使用 ETLBeginPeriod 并忘记将其更改为 Counter 变量。一旦我这样做了,它就起作用了。参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多