У меня есть несколько пакетов SSIS, которые анализируют разные файлы в соответствующие таблицы. Используя задачу SSIS File Watcher, я хочу создать главный пакет, который будет проверять папку на наличие файлов, а затем выбирать соответствующий подпакет на основе OutputVariableName с использованием ограничения приоритета. Я не уверен, как написать выражение для правильной установки переменной. Я хочу установить его на основе FINDSTRING () в имени файла.
Выполнять разные пакеты SSIS на основе имени плоского файла
Ответы (1)
Ваш вопрос касается использования задачи отслеживания файлов от Konesans в пакеты интеграционных услуг.
OutputVariableName String Имя переменной, в которую будет записан полный путь к найденному файлу после завершения задачи. Указанная переменная должна быть строкового типа
Через http://www.sqlis.com/post/file-watcher-task.aspx
Создайте переменную SSIS на уровне пакета с именем CurrentFileName. Настройте File Watcher Task
так, чтобы свойство OutputVariableName было User::CurrentFileName
. Когда вы перетаскиваете файл в папку, за которой наблюдает задача, он назначит полный путь к этой переменной CurrentFileName
.
Вы хотите сделать что-нибудь с этой переменной с помощью функции FindString, чтобы определить запускаемый пакет. Поскольку вы не указываете something, я предполагаю, что это основано на имени файла.
Жаль, что вы заставляете человека использовать FindString для выполнения этой задачи. Я говорю это, потому что библиотека .NET предлагает отличный статический метод для определения имен базовых файлов, и я ненавижу, когда люди заново изобретают (и отлаживают) колесо.
Я бы создал 3 переменных, чтобы поддержать это начинание.
- BaseFileName - String - Оценить как Expression = True
- FileExtensionPosition - Int32 - Оценить как Expression = True
- LastSlashPosition - Int32 - Оценить как Expression = True
LastSlashPosition
будет использовать FindString для определения последнего появления \
в строке. FileExtensionPosition
будет определять последнее появление .
в строке. BaseFileName будет использовать эти числа, чтобы вычислить, где разрезать строку @ [User :: CurrentFileName] `.
Ленивый трюк, который я использую для поиска последнего X в строке, - это перевернуть его. Затем это первый элемент в строке, и я могу передать 1 в качестве последнего параметра FindString.
Выражение, присвоенное @ [User :: LastSlashPosition]:
FINDSTRING(REVERSE(@[User::CurrentFileName]), "\\", 1)
Выражение, присвоенное @ [User :: FileExtensionPosition]:
FINDSTRING(REVERSE(@[User::CurrentFileName]), ".", 1)
Выражение, присвоенное @ [User :: BaseFileName], затем становится
SUBSTRING((RIGHT(@[User::CurrentFileName], @[User::LastSlashPosition] -1 )), 1, LEN(RIGHT( @[User::CurrentFileName], @[User::LastSlashPosition] -1)) - @[User::FileExtensionPosition] )
Разбивая это на части, (RIGHT(@[User::CurrentFileName], @[User::LastSlashPosition] -1 ))
переводится как базовое имя файла. Если CurrentFileName равно J: \ ssisdata \ so \ FileWatcher \ CleverFile.txt, тогда это оценивается как "CleverFile.txt" I подстрока, которая убирает конец. Вы можете сократить это до одной операции с подстрокой, но у меня так поздно болит мозг.
Теперь вы пытаетесь использовать, я полагаю, серию задач «Выполнение пакета», основанных на ограничении приоритета успеха и @[User::BaseFilename] == "SubPackage1
. Вы можете сделать это, и он будет работать нормально, просто вам нужно будет настроить каждую из них и как вы идете заводить нового ребенка, вам придется повторить работу.
В качестве альтернативы этому подходу я бы использовал перечислитель ForEach и определил бы там все свои пары ключ-значение.
Столбец 0 - это значение, которое может оценивать BaseFileName.
Столбец 1 - это пакет SSIS, который я хочу запустить в ответ.
Я создал две переменные для поддержки этого и настроил их как таковые
Мой полученный пакет выглядит как
Не показана задача File Watcher, потому что у меня нет желания устанавливать ее на моем компьютере. Предположим, что он подключается к циклу ForEach.
Цикл ForEach перебирает пары ключ-значение, показанные выше. Задача сценария внутри контейнера предназначена только для того, чтобы обеспечить основу для работы ограничения приоритета. Я настраиваю ограничение приоритета как Успех и @[User::KeyName] == @[User::BaseFileName]
Затем я моделирую запуск задачи «Выполнить пакет» на основе этого. Фактическое имя пакета будет определяться значением @ [User :: KeyPackage]
И это ваше замысловатое решение на день;)