我有一个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循环容器,如下所示:
@[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;
}
Run Code Online (Sandbox Code Playgroud)
如果MinInteger设置为20120229并且MaxInteger设置为20120302,则程序包将在执行期间显示以下值.
希望有所帮助.



| 归档时间: |
|
| 查看次数: |
11581 次 |
| 最近记录: |