Как перебрать только те файлы, которые не существуют в месте назначения, используя пакет служб SSIS? - PullRequest
7 голосов
/ 06 июля 2011

У меня в сети есть папка с файлами, и я перемещаю файлы из одной папки в другую. Но я хочу только переместить новые файлы, поэтому копируйте только те файлы, которые не существуют в папке назначения. Как? У меня уже есть контейнер цикла for each и задача файловой системы. Я использую переменные. Прямо сейчас он копирует все файлы из одной папки в следующую при каждом запуске пакета. Есть ли какой-то условный инструмент, который я могу использовать? Я не очень хорош в написании сценариев, поэтому, если это единственное решение, мне может понадобиться ваша помощь.

Ответы [ 2 ]

11 голосов
/ 12 июля 2011

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

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

  1. Создайте две папки с именами Источник и Место назначения в пути C:\temp\, как показано на скриншоте # 1 .

  2. Поместите образец файла с именем Sample_File_01.txt в путь к папке C:\temp\Source\ и оставьте другую папку C:\temp\Destination\ пустой. Пакет служб SSIS будет копировать файлы из исходной папки в папку назначения только в том случае, если файл уже не существует. Смотрите скриншоты # 2 и # 3 .

  3. В пакете служб SSIS создайте 7 переменных, как показано на скриншоте # 4 . Установите для переменной DestinationFolder значение C:\temp\Destination\. Установите для переменной SourceFolder значение C:\temp\Source\. Задайте для переменной FilePattern значение *.*. Вы можете изменить значения этих переменных в соответствии с вашими требованиями.

  4. Выберите переменную SourceFilePath и откройте окно Properties, нажав кнопку F4 . Измените свойство EvaluateAsExpression на True и установите для свойства Expression значение @[User::SourceFolder] + @[User::FileName]. Смотрите скриншот # 5 .

  5. Выберите переменную DestinationFilePath и откройте окно Properties, нажав кнопку F4 . Измените свойство EvaluateAsExpression на True и установите для свойства Expression значение @[User::DestinationFolder] + @[User::FileName]. Смотрите скриншот # 6 .

  6. На вкладке C Flow Control пакета SSIS поместите Foreach Loop container и настройте свойства контейнера, как показано на скриншотах # 7 и # 8 . Убедитесь, что вы выбрали переключатель Name and extension в разделе Коллекция .

  7. В контейнере «цикл по каждому элементу» поместите Script Task. Дважды щелкните задачу «Сценарий» и нажмите кнопку Edit Script. Замените метод Main () внутри задачи скрипта на код, указанный в разделе Код задачи скрипта . Этот код проверяет, существует ли уже файл назначения или нет, а затем заполняет логическую переменную DoesFileExist соответственно.

  8. В контейнере «цикл по каждому элементу» поместите File System Task ниже задачи «Сценарий». Подключите зеленую стрелку успеха задачи «Сценарий» к задаче «Файловая система». Настройте задачу файловой системы, как показано на скриншоте # 9 .

  9. Нам нужно, чтобы задача файловой системы выполнялась только в том случае, если файл не существует в целевом пути. Итак, нам нужно изменить соединитель между задачей сценария и задачей файловой системы. Щелкните правой кнопкой мыши зеленый разъем и выберите «Редактировать», как показано на скриншоте # 10 .

  10. Настройте ограничение приоритета, как показано на скриншоте # 11 . Это проверяет, содержит ли переменная DoesFileExist значение False, что означает, что файл не был найден в месте назначения.

  11. После настройки пакет служб SSIS должен выглядеть примерно так, как показано на скриншоте # 12 .

  12. Снимок экрана # 13 показывает выполнение пакета first . Во время этого выполнения в целевом пути не было файлов C:\temp\Destination\. После выполнения файл Sample_File_01.txt был скопирован из C:\temp\Source\ в C:\temp\Destination\. Смотрите скриншот # 14 .

  13. Снимок экрана # 15 показывает выполнение пакета second . Во время этого выполнения ни один файл не был скопирован по пути назначения C:\temp\Destination\. Как вы можете заметить, File System Task не был выполнен из-за сбоя ограничения Precedence.

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

Код задачи скрипта:

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

public void Main()
{
    Variables varCollection = null;

    Dts.VariableDispenser.LockForRead("User::DestinationFilePath");
    Dts.VariableDispenser.LockForWrite("User::DoesFileExist");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    varCollection["User::DoesFileExist"].Value = Convert.ToBoolean(System.IO.File.Exists(varCollection["User::DestinationFilePath"].Value.ToString()));

    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

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

12

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

13

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

14

Скриншот № 15:

15

1 голос
/ 06 июля 2011

Вот потенциальное решение с двумя допущениями:

  1. Все файлы в папке назначения были перемещены этим пакетом.
  2. Имена файлов уникальны.

Вы можете добавить шаг регистрации имени файла в ETL.

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

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

...