Импорт нескольких плоских файлов в несколько таблиц SQL

Вот моя настройка папки.

Структура папок

Вот настройки файла

Файловая структура

Идея состоит в том, чтобы просмотреть папки и поместить содержимое FileA в таблицу FileA.dbo в базе данных (также FileB,FileC и т. Д.). Структура FileName одинакова во всех папках.

У меня есть этот пакет ssis, где я анализирую папки с помощью foreachloop-> dataflow.

ssis1 ssis2

Я проверил, что алгоритм, который я сформулировал, чтобы получить имя файла, работает

REVERSE(Substring(Reverse( @[User::FileName] ),5,LEN( @[User::FileName] ))) == "FileA"

Он разбирает расширение.txt. Ниже приведена настройка цикла foreach, который у меня есть. Для каждого

Чтобы запустить весь этот пакет, в папке есть файлы.txt и я создаю подпапки цикла контейнера foreach.

отправная точка

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

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

Но общее количество строк, которые я вижу после успешного выполнения пакета, чрезвычайно мало и не может быть правильным. Есть ли в любом случае, чтобы получить счет / список количества папок, которые он прошел. Кроме того, я делаю что-то не так?

В идеале мне бы хотелось, чтобы не нужно было начинать с файлов.txt, но нужно было просто перейти к папкам, получить имена файлов (для которых, я думаю, у меня есть рабочий код) и просто сбросить всю информацию на OLEDB Направления.

Любая помощь, ссылка на ресурсы высоко ценится.

1 ответ

Обзор решения

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

Примечание. Структура плоских файлов должна быть одинаковой, а таблицы SQL должны иметь одинаковую структуру.


Детальное решение

  1. Щелкните правой кнопкой мыши на Control Flow окно и нажмите на Variables

  1. Объявите 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","") + "]"

  1. Добавить Foreach Loop Container и DataFlow Task внутри, нажмите на DataFlow Task и на вкладке свойств, установите Delay Validation собственность на True

  1. Дважды щелкните на Foreach Loop container и выберите основной каталог и фильтр файлов *.txt также выберите fully qualified опция получения имени файла

  1. Перейдите на вкладку "Отображение переменных" и выберите @[User::FlatFilename] переменная

  1. Добавить 2 Диспетчер соединений

    • FlatFileConnection: менеджер соединений с плоскими файлами, и настройте его, выбрав случайным образом File (т.е. C:\MockFolder\FileA.txt )
    • OLEDBConnection: менеджер соединений OLEDB и настройте его для своей целевой базы данных SQL Server
  2. В DataFlow Task, добавить Flat File Source и OLEDB Destination, в OLEDB Destination Выбрать Table name from variable вариант и выберите @[User::SQLTablename] как имя переменной

  1. Столбцы карты между источником и местом назначения

  2. Нажми на FlatFileConnection в окне диспетчера подключений нажмите F4 чтобы показать вкладку свойств, нажмите на выражения

  1. Выберите Connection String Свойству присваивают ему следующее выражение:

    @[user::FlatFilename]
    

Другие вопросы по тегам