如何在For循环容器中循环存储为数字的日期值?

Red*_*xel 3 ssis

我有一个For Loop Container使用日期InitExpression(@Load_Date),但值是数字格式(20120229),我需要它,因为我无法修改它.

现在,我想设置AssingExpression值,使@Load_Date变量可以递增,因为它是一个日期.换句话说,分配给变量@Load_Date的数值20120229应该增加到20120301,因为这是下一个逻辑日期.

如何在SSIS包中的For循环容器中实现此目的?

小智 8

这是一种可以实现此目的的方法.以下示例使用SSIS 2012.

假设您有两个包含最小和最大日期范围的变量,但它们以数字格式存储,您仍然希望这些值遵守日期规则.

声明以下变量:

  • MinInteger- 此数据类型变量Int32将以数字格式存储最小日期值.如果您使用的是SSIS 2012,建议将其创建为参数,以便在运行时轻松配置值.

  • MaxInteger- 此数据类型变量Int32将以数字格式存储最大日期值.如果您使用的是SSIS 2012,建议将其创建为参数,以便在运行时轻松配置值.

  • MinString- 此数据类型变量String将数字格式的最小日期值转换为字符串,以便在分割值以创建日期格式时更容易使用.将表达式设置为(DT_WSTR, 10) @[User::MinInteger]

  • MaxString- 此数据类型变量String将数字格式的最大日期值转换为字符串,以便在分割值以创建日期格式时更容易使用.将表达式设置为(DT_WSTR, 10) @[User::MaxInteger]

  • MinDate- 此数据类型的变量DateTime将拆分最小日期的字符串值以制定日期值.将此变量的表达式设置为以下内容:

(DT_DATE)(SUBSTRING(@ [User :: MinString],1,4)+" - "+ SUBSTRING(@ [User :: MinString],5,2)+" - "+ SUBSTRING(@ [User :: MinString ],7,2))

  • MaxDate- 此数据类型的变量DateTime将拆分最大日期的字符串值以制定日期值.将此变量的表达式设置为以下内容:

(DT_DATE)(SUBSTRING(@ [User :: MaxString],1,4)+" - "+ SUBSTRING(@ [User :: MaxString],5,2)+" - "+ SUBSTRING(@ [User :: MaxString ],7,2))

如果您使用的是SSIS 2008 R2或以前的版本,则需要将上述最后四个变量的EvaluateAsExpression属性设置为True.

  • Loop- 此变量的数据类型DateTime将用于循环For循环容器中的日期值.

变量

配置For循环容器,如下所示:

  • InitExpression: @[User::Loop]=@[User::MinDate]
  • EvalExpression: @[User::Loop]<=@[User::MaxDate]
  • 赋值表达式: @[User::Loop]=DATEADD("dd", 1, @[User::Loop])

样本会将值递增1天,但您可以根据需要对其进行配置.您还可以将DATEPART增量编号存储在另一个变量/参数中,以便于配置.

对于循环

我在For循环中放置了一个Script Task来说明示例包的执行.脚本任务将变量User :: Loop设置为ReadOnlyVariables,并包含以下C#代码.

public void Main()
{
    MessageBox.Show(string.Format("Current loop variable value: {0}", Dts.Variables["Loop"].Value.ToString()));
    Dts.TaskResult = (int)ScriptResults.Success;
}
Run Code Online (Sandbox Code Playgroud)

如果MinInteger设置为20120229并且MaxInteger设置为20120302,则程序包将在执行期间显示以下值.

希望有所帮助.

输出1

输出2

输出3