3

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

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

如何在 SSIS 包的 For 循环容器中实现这一点?

4

2 回答 2

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 循环容器,如下所示:

  • 初始化表达式:@[User::Loop]=@[User::MinDate]
  • 评估表达式:@[User::Loop]<=@[User::MaxDate]
  • 赋值表达式:@[User::Loop]=DATEADD("dd", 1, @[User::Loop])

该示例将值增加 1 天,但您可以根据需要进行配置。您还可以将DATEPART增量编号存储在另一个变量/参数中,以便于配置。

循环

我在 For 循环中放置了一个脚本任务来说明示例包的执行。脚本任务将变量 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;
}

如果MinInteger设置为20120229MaxInteger设置为20120302,则包在执行过程中将显示以下值。

希望有帮助。

输出 1

输出 2

输出 3

于 2012-11-06T21:11:57.907 回答
2

将循环驱动程序存储为日期,以便它可以进行日期运算,然后使用由基于该日期的表达式驱动的变量将其放入内部使用所需的格式。

于 2012-11-06T20:49:40.277 回答