SSIS, исключая несколько элементов в цикле foreach - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть файловая система, которая содержит переменное количество папок. Эти папки могут содержать или не содержать файл, предназначенный для дальнейшей обработки. Существуют определенные папки, которые я sh исключаю из обработки. Список исключенных папок является переменной с разделителями-запятыми. Число исключенных папок, содержащихся в переменной с разделителями, может измениться.
Например, в настоящее время переменная с разделителями «обработано, исключено, неизвестно»
Позже переменная с разделителями может выглядеть как «обработано, исключено, unknown, download, "

Я нашел эту ссылку" Пропуск элементов в A Foreach L oop ", которая работает до тех пор, пока исключенные папки жестко закодированы https://www.timmitchell.net/post/2009/09/16/skipping-items-in-a-foreach-loop/

Например, ограничение приоритета в настоящее время жестко запрограммировано так: FINDSTRING (@ [User :: FullFileName], "unknown", 1) == 0

У меня есть вопрос: 1 ) Оптимальный способ разбить строку с разделителями на дискретные значения 2) Оптимальный способ оценки переменной foreach (в моем примере, calle d FullFileName) для списка исключенных папок

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Аналогичные логики c для хорошего поста Тима (у меня не установлен SSIS, но у меня есть BimlStudio, поэтому, пожалуйста, примите разные значки для объектов SSIS).

enter image description here

3 Переменные

  • CurrentFilename строка - будет содержать текущее имя файла, которое может содержать или не содержать значение исключения
  • ExclusionList строка - строка с разделителями, которую вы хотите исключить
  • IncludeCurrent логический - False, и мы переопределим для l oop

внутри файла Foreach L oop, Я бы использовал задачу «Сценарий», так как это будет самый эффективный метод для разделения ExclusionList, а также для выполнения тестов файловой системы. В результате выполнения задачи «Сценарий» мы установим для @[User::IncludeCurrent] значение true или false.

Прецедентная логика ограничений c между задачей «Сценарий» и задачей «Поток данных» будет упрощена с ссылка на просто @[User::IncludeCurrent].

Если условие выполнено, мы выполняем задачу DFT. В противном случае мы пропускаем его.

Проверка на включение

Вам нужно будет передать CurrentFilename и ExclusionList как переменные только для чтения в задачу Script. IncludeCurrent будет передан как переменная для чтения / записи.

Замечания по предложению Радж Мора

SPLIT_STRING предполагает SQL Server 2016+. Как консультант, я мог бы sh Я мог бы рассчитывать на новейшие доступные функции, но это часто не так.

Я считаю, что вы можете столкнуться с проблемой двойного для каждого подхода l oop этот внутренний набор записей (разделенный список запроса) помечается как исчерпанный после первого прохода, поэтому вам нужно изменить этот подход как FEL C Все файлы -> Запрос OLE DB -> FEL C Фильтр

Если у вас более сложное тестирование, чем чистое сопоставление строк, подход с использованием сценариев обеспечит максимальную гибкость.

0 голосов
/ 14 апреля 2020

Я бы подключился к базе данных, сделал SPLIT_STRING, поместил результат обратно в объект и использовал for-each loop для каждого имени папки ... так что у вас было бы два цикла для каждого, внешний для поиска совпадений и внутренний для игнорирования подпапок.

Кроме того, не забудьте учесть чувствительность к регистру при сравнении строк в SSIS.

...