При работе с SQL Server Integration Services (SSIS) вы можете столкнуться с ограничением в компоненте Foreach Loop. Это ограничение возникает, когда вам нужно выбрать разные наборы файлов из папки, такие как файлы TXT и файлы PDF, при этом пропуская все остальные типы файлов. К счастью, существует решение этой проблемы, которое включает создание небольшого скрипта внутри пакета SSIS.
Для начала давайте рассмотрим проблему. Компонент Foreach Loop позволяет вам перебирать файлы, устанавливая параметр Files на определенный тип файла, такой как “*.TXT” или “*.PDF”. Однако нет возможности выбрать несколько типов файлов одновременно.
Чтобы преодолеть это ограничение, мы можем создать скрипт в пакете SSIS, который обновляет переменную, на которую можно ссылаться контейнером Foreach Loop. Этот скрипт позволит нам выбирать и обрабатывать несколько типов файлов одновременно.
Вот пример того, как скопировать файлы Excel и файлы TXT с использованием этого подхода:
FileFilters = "*.txt|*.xlsx"
SourceFolder = "C:\Source"
TargetFolder = "C:\Target"
Разделяя разные типы файлов символом вертикальной черты (|), мы можем указать, какие типы файлов должны быть скопированы. Этот подход может использоваться для любого количества типов файлов и также может быть изменен для перемещения или удаления файлов.
Давайте ближе рассмотрим шаги, необходимые для реализации этого решения:
- Создайте следующие переменные в пакете SSIS:
- FileFilters: Эта переменная должна содержать типы файлов, которые вы хотите выбрать, разделенные символом вертикальной черты (|).
- FileList: В этой переменной будет храниться список файлов, соответствующих указанным типам файлов.
- SourceFolder: Эта переменная должна содержать путь к исходной папке.
- TargetFolder: Эта переменная должна содержать путь к целевой папке.
- FileName: Эта переменная будет динамически получать значение внутри контейнера Foreach Loop.
- Обновите пакет SSIS следующим образом:
- Создайте задачу скрипта с именем “ST-Multiple file types load”, которая будет выполняться.
- Создайте контейнер Foreach Loop с именем “EACH-Copy files” для перебора файлов.
- Создайте задачу файловой системы с именем “FILE-Copy File” для копирования файлов.
- Настройте все три компонента в соответствии с предоставленными скриншотами.
- Реализуйте следующий код в задаче скрипта:
public void Main()
{
string DataFolder, FileFilters;
DataFolder = Dts.Variables["User::SourceFolder"].Value.ToString();
FileFilters = Dts.Variables["User::FileFilters"].Value.ToString();
ArrayList LookupFiles = new ArrayList();
string[] strFileFilters = FileFilters.Split('|');
// Для каждого фильтра находим соответствующие имена файлов
foreach (string FileFilter in strFileFilters)
{
LookupFiles.AddRange(Directory.GetFiles(DataFolder, FileFilter, System.IO.SearchOption.AllDirectories));
}
Dts.Variables["User::FileList"].Value = LookupFiles;
Dts.TaskResult = (int)ScriptResults.Success;
}
Если вы хотите переместить файлы вместо их копирования, установите параметр “Operation” в “Move file”. Аналогично, если вы хотите удалить файлы, установите параметр “Operation” в “Delete file”.
После выполнения цикла Foreach Loop вы обнаружите, что выбранные файлы были скопированы из исходной папки в целевую папку.
В заключение, мы исследовали, как изменить поведение контейнера Foreach Loop в SSIS для перебора набора определенных типов файлов в папке и выполнения операций, таких как копирование, перемещение или удаление. Создав скрипт, который считывает значение фильтра и возвращает объект со всеми файлами, соответствующими фильтру, мы можем настроить поведение цикла Foreach Loop в соответствии с нашими потребностями.
Этот подход может быть применен к различным сценариям и не ограничивается только копированием файлов. С небольшими изменениями вы также можете использовать эту технику для других операций.
Спасибо за прочтение этого блог-поста о работе с несколькими типами файлов в цикле SSIS Foreach Loop. Мы надеемся, что вы нашли его информативным и полезным в ваших проектах SQL Server.