我有一个For Loop Container
使用的日期为InitExpression
( @Load_Date ),但值的格式为数字格式(20120229),我需要这样,因为我不能修改它。
现在,我想设置AssingExpression
值,使 @Load_Date 变量可以递增,因为它是一个日期。换句话说,分配给变量 @Load_Date 的数字值 20120229 应增加到 20120301 ,因为这是下一个逻辑日期。
如何在SSIS包中的For循环容器中实现此目的?
答案 0 :(得分: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(2))
MaxDate
- 此数据类型DateTime
的变量将拆分最大日期的字符串值以制定日期值。将此变量的表达式设置为以下内容:(DT_DATE)(SUBSTRING(@ [User :: MaxString],1,4)+“ - ”+ SUBSTRING(@ [User :: MaxString],5,2)+“ - ”+ SUBSTRING(@ [User :: MaxString],7,2(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循环中放置了一个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;
}
如果MinInteger
设置为 20120229 且MaxInteger
设置为 20120302 ,则程序包将在执行期间显示以下值。< / p>
希望有所帮助。
答案 1 :(得分:2)
将循环驱动程序存储为日期,以便它可以进行日期算术运算,然后使用由基于该日期的表达式驱动的变量,将其置于内部使用所需的格式中。