如何在SSIS包中使用Foreach循环容器选择最近创建的文件夹?

emd*_*emd 1 ienumerator ssis file

我对SSIS有一个有趣的挑战.使用for-each文件枚举器,我需要选择最近创建的子文件夹,然后遍历每个文件.

也许一个例子可以更好地解释.文件夹看起来像这样:

C:\数据\ 2011-0703

C:\数据\ 2011-0626

C:\数据\ 2011-0619

你怎么能得到每个文件枚举器来选择最新的文件夹?这可以通过查看创建日期或比较文件名来实现.

我猜它会在枚举器中用表达式完成,只是无法弄清楚如何!也无法在网上找到任何东西.

谢谢

小智 5

这是一个可能的选项,你可以借助于实现这一目标Script Task.以下示例显示了如何完成此操作.该示例是在SSIS 2008 R2中创建的.

分步过程:

  1. 创建三个名为的文件夹2011-0619,2011-06262011-0703在文件夹路径C:\temp\中显示,如屏幕截图#1所示.记下Date created每个文件夹的值.

  2. 在每个文件夹中放置几个​​文件,如屏幕截图#2 - #4所示.

  3. 在SSIS包上,创建四个变量,如屏幕截图#5所示.使用值设置变量RootFolderC:\temp\(在您的情况下,这将是c:\ data).使用值设置变量FilePattern*.*.将在"脚本任务"中为变量RecentFolder分配最近的文件夹路径.要避免设计时错误,请为变量RecentFolder指定有效的文件路径.当文件在最近的文件夹中循环时,将为变量FilePath分配值.

  4. 在SSIS包上,放置一个脚本任务.使用脚本任务代码在脚本任务代码(获取最近文件夹)部分下替换脚本任务中的Main()方法:.此脚本获取根文件夹中的文件夹列表,并循环检查创建日期时间以选择最近创建的文件夹.然后,最近创建的文件夹路径存储在变量RecentFolder中.

  5. 在SSIS包上,放置一个Foreach循环容器并按照屏幕截图#6和#7中的配置进行配置.

  6. 将脚本任务放在Foreach循环容器中.使用脚本任务代码在脚本任务代码(显示文件名)部分下替换脚本任务中的Main()方法:.此脚本只显示最近创建的文件夹中的文件名.

  7. 配置完所有任务后,程序包应如屏幕截图#8所示.

  8. 屏幕截图#9 - #11显示该包显示最近创建的文件夹2011-0703中的文件名.

希望有所帮助.

脚本任务代码(获取最近的文件夹):

只能在SSIS 2008及更高版本中使用的C#代码.

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::RootFolder");
    Dts.VariableDispenser.LockForWrite("User::RecentFolder");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    string rootFolder = varCollection["User::RootFolder"].Value.ToString();
    DateTime previousFolderTime = DateTime.MinValue;
    string recentFolder = string.Empty;

    foreach (string subFolder in System.IO.Directory.GetDirectories(rootFolder))
    {
        DateTime currentFolderTime = System.IO.Directory.GetCreationTime(subFolder);
        if (previousFolderTime == DateTime.MinValue || previousFolderTime <= currentFolderTime)
        {
            previousFolderTime = currentFolderTime;
            recentFolder = subFolder;
        }
    }

    varCollection["User::RecentFolder"].Value = recentFolder;

    Dts.TaskResult = (int)ScriptResults.Success;
}
Run Code Online (Sandbox Code Playgroud)

脚本任务代码(显示文件名):

只能在SSIS 2008及更高版本中使用的C#代码.

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::FilePath");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    MessageBox.Show(varCollection["User::FilePath"].Value.ToString(), "File Path");

    Dts.TaskResult = (int)ScriptResults.Success;
}
Run Code Online (Sandbox Code Playgroud)

截图#1:

1

截图#2:

2

截图#3:

3

截图#4:

4

截图#5:

五

截图#6:

6

截图#7:

7

截图#8:

8

截图#9:

9

截图#10:

10

截图#11:

11