SSIS For Loop-在循环中按月递增“ YYYYMM”

时间:2019-11-21 22:44:51

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

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

SSIS For Loop Container with Date Variable

我将变量设置如下:

User Variables

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

Variables Get Set

然后是For循环中的表达式

For Loop Expressions

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再试一次。因此,它似乎并没有改变计数值。

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

我发现了这一点-我决定添加一个脚本任务来查看变量,结果发现它们在正确地递增,但是我分配了错误的变量才能传递给存储过程。我最初一直在使用ETLBeginPeriod,却忘记将其更改为Counter变量。一旦我做到了,它就会起作用。精氨酸。