Импорт нескольких плоских файлов в несколько таблиц SQL
Вот моя настройка папки.
Вот настройки файла
Идея состоит в том, чтобы просмотреть папки и поместить содержимое FileA в таблицу FileA.dbo в базе данных (также FileB,FileC и т. Д.). Структура FileName одинакова во всех папках.
У меня есть этот пакет ssis, где я анализирую папки с помощью foreachloop-> dataflow.
Я проверил, что алгоритм, который я сформулировал, чтобы получить имя файла, работает
REVERSE(Substring(Reverse( @[User::FileName] ),5,LEN( @[User::FileName] ))) == "FileA"
Он разбирает расширение.txt. Ниже приведена настройка цикла foreach, который у меня есть.
Чтобы запустить весь этот пакет, в папке есть файлы.txt и я создаю подпапки цикла контейнера foreach.
Поскольку я на самом деле не являюсь разработчиком пакетов служб SSIS, это лучшее, что я мог бы сделать с некоторыми исследованиями. Проблема, с которой я сталкиваюсь, кажется, что она работает частично.
Снимки - это макеты сценария, который у меня есть, и на самом деле у меня есть более 200 папок с 50 текстовыми файлами, каждый из которых предназначен для выгрузки содержимого в соответствующие именованные таблицы.
Но общее количество строк, которые я вижу после успешного выполнения пакета, чрезвычайно мало и не может быть правильным. Есть ли в любом случае, чтобы получить счет / список количества папок, которые он прошел. Кроме того, я делаю что-то не так?
В идеале мне бы хотелось, чтобы не нужно было начинать с файлов.txt, но нужно было просто перейти к папкам, получить имена файлов (для которых, я думаю, у меня есть рабочий код) и просто сбросить всю информацию на OLEDB Направления.
Любая помощь, ссылка на ресурсы высоко ценится.
1 ответ
Обзор решения
Вы можете достичь этого, используя одну задачу DataFlow в цикле foreach, но хитрость заключается в том, что вам нужно читать имя исходного файла и имя таблицы назначения из переменных.
Примечание. Структура плоских файлов должна быть одинаковой, а таблицы SQL должны иметь одинаковую структуру.
Детальное решение
- Щелкните правой кнопкой мыши на
Control Flow
окно и нажмите наVariables
Объявите 2 переменные служб SSIS:
FlatFilename
: типаString
и назначить значение по умолчанию случайный путь к файлу (т.е.C:\MockFolder\FileA.txt
)- "SQL Table name
: of type
String` и присвойте ему следующее выражение:
Это предполагает, что все таблицы назначения имеют одинаковую схему dbo
"[dbo].[" + REPLACE(RIGHT( @[User::FlatFilename] , FINDSTRING(REVERSE( @[User::FlatFilename] ) , "\\", 1) - 1),".txt","") + "]"
- Добавить
Foreach Loop Container
иDataFlow Task
внутри, нажмите наDataFlow Task
и на вкладке свойств, установитеDelay Validation
собственность наTrue
- Дважды щелкните на
Foreach Loop container
и выберите основной каталог и фильтр файлов*.txt
также выберитеfully qualified
опция получения имени файла
- Перейдите на вкладку "Отображение переменных" и выберите
@[User::FlatFilename]
переменная
Добавить 2 Диспетчер соединений
- FlatFileConnection: менеджер соединений с плоскими файлами, и настройте его, выбрав случайным образом
File
(т.е.C:\MockFolder\FileA.txt
) - OLEDBConnection: менеджер соединений OLEDB и настройте его для своей целевой базы данных SQL Server
- FlatFileConnection: менеджер соединений с плоскими файлами, и настройте его, выбрав случайным образом
В
DataFlow Task
, добавитьFlat File Source
иOLEDB Destination
, вOLEDB Destination
ВыбратьTable name from variable
вариант и выберите@[User::SQLTablename]
как имя переменной
Столбцы карты между источником и местом назначения
Нажми на
FlatFileConnection
в окне диспетчера подключений нажмитеF4
чтобы показать вкладку свойств, нажмите на выражения
Выберите
Connection String
Свойству присваивают ему следующее выражение:@[user::FlatFilename]