Как выбрать последнюю созданную папку с помощью контейнера цикла Foreach в пакете служб SSIS? - PullRequest
1 голос
/ 04 июля 2011

У меня есть интересная проблема с SSIS. Используя перечислитель для каждого файла, мне нужно выбрать подпапку, которая была создана последним, и затем пройтись по каждому из файлов.

Возможно, пример объяснит лучше. Папки выглядят примерно так:

C: \ Data \ 2011-0703

C: \ Data \ 2011-0626

C: \ Data \ 2011-0619

Как вы могли бы получить для каждого перечислителя файлов выбрать самую последнюю папку? Это может быть либо путем просмотра даты создания, либо сравнения имен файлов.

Я предполагаю, что это будет сделано с помощью выражения в перечислителе, просто не могу понять, как! Ничего не могу найти в сети.

Спасибо

Ответы [ 2 ]

5 голосов
/ 13 июля 2011

Вот один из возможных вариантов, которого вы можете достичь с помощью Script Task. Следующий пример показывает, как это можно сделать. Пример был создан в SSIS 2008 R2.

Пошаговый процесс:

  1. Создайте три папки с именами 2011-0619, 2011-0626 и 2011-0703 в пути к папке C:\temp\, как показано на скриншоте # 1 . Запишите значение Date created каждой из папок.

  2. Поместите несколько файлов в каждую из папок, как показано на скриншотах # 2 - # 4 .

  3. В пакете служб SSIS создайте четыре переменные, как показано на скриншоте # 5 . Установите переменную RootFolder со значением C:\temp\ (в вашем случае это будет c: \ data). Установите переменную FilePattern со значением *.*. Переменной RecentFolder будет присвоен путь к последней папке в Задаче сценария. Чтобы избежать ошибок времени разработки, присвойте переменной RecentFolder правильный путь к файлу. Переменной FilePath будут присвоены значения, когда файлы будут перебраны в последней папке.

  4. В пакете служб SSIS поместите задачу сценария. Замените метод Main () в Задаче сценария на код задачи сценария, указанный в разделе Код задачи сценария (Получить последнюю папку): . Этот сценарий получает список папок в корневой папке и циклически просматривает дату создания для выбора самой последней созданной папки. Недавно созданный путь к папке сохраняется в переменной RecentFolder .

  5. В пакете служб SSIS поместите контейнер цикла по каждому элементу и настройте его, как показано на скриншотах # 6 и # 7 .

  6. Поместите задачу скрипта в контейнер цикла по каждому элементу. Замените метод Main () в Задаче сценария на код задачи сценария, указанный в разделе Код задачи сценария (Показать имена файлов): . Этот скрипт просто отображает имена файлов в недавно созданной папке.

  7. После настройки всех задач пакет должен выглядеть так, как показано на скриншоте # 8 .

  8. Снимки экрана # 9 - # 11 показывают, что пакет отображает имена файлов в недавно созданной папке 2011-0703 .

Надеюсь, это поможет.

Код задачи скрипта (Получить последнюю папку):

C # код, который можно использовать только в SSIS 2008 и выше .

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;
}

Код задачи скрипта (Показать имена файлов):

C # код, который можно использовать только в SSIS 2008 и выше .

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;
}

Скриншот №1:

1

Скриншот № 2:

2

Скриншот № 3:

3

Скриншот № 4:

4

Снимок экрана № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Скриншот № 8:

8

Снимок экрана № 9:

9

Снимок экрана № 10:

10

Скриншот № 11:

11

0 голосов
/ 04 июля 2011

Итерация по папкам.Сохраните имя первого.Сравните это сохраненное значение с именем каждой последующей папки.Если следующая папка более новая, поменяйте это имя и продолжайте.В конце вашим сохраненным значением будет имя самой последней папки (если вы сравниваете даты создания, вам нужно сохранить и имя папки, и дату создания).

Затем вы можетеиспользуйте сохраненное значение в качестве аргумента для вашего второго цикла итерации.

...