SSIS - загрузка файлов CSV, расположенных в таблице SQL Server - PullRequest
1 голос
/ 11 апреля 2019

Мне нужно решение для задачи, над которой я работаю.Мне нужно загрузить несколько файлов CSV в таблицу сервера SQL.ВСЕ CSV имеют одинаковую структуру.

Источник CSV находится в таблице сервера sql.

Структура SOURCE_TABLE.

ID -> Primary Key - IDENTITY
Path -> Varchar(100)

Данные Source_Table

ID  Path
1   c:\1.csv
2   c:\2.csv
3   c:\x.csv
.
.
.
.

Структура Target_Table (в этой таблице нет первичного ключа).

ID - INT     -> Foreign key from Source Table. (This is NOT primary key)
Date - Today Date&Time
1    --> All 1 through 5 are headers from CSV file. basically they are the contents from the csv file
2
3
4
5

Таблица назначения содержит TARGET_TABLE

ID      DateTime   <-and the columns from CSV file ->
1       Today      x  y  z  -> contents of c:\1.csv
1       Today      1  2  3  -> contents of c:\1.csv
1       Today      4  5  6  -> contents of c:\1.csv
1       Today      x  y  z  -> contents of c:\1.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
2       today      sdf sdf sdf  -> contents of c:\2.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv
3       today      sdfs  sds  sdf  -> contents of c:\x.csv

и т. Д. ...

Идентификатор в TARGE_TABLE должен совпадать с идентификатором в SOURCE TABLE

. Любая помощь приветствуется.

1 Ответ

2 голосов
/ 11 апреля 2019

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

  • Создайте три переменные. Первый из них имеет тип данных int, который можно назвать ID. Сделайте вторую переменную строковым типом данных и назовите ее FilePath или что-то подобное. Тип данных объекта будет использоваться для третьей переменной и может называться FileList.
  • Создайте диспетчер соединений с плоским файлом, используя определение любого исходного файла. Поскольку он будет использоваться для загрузки нескольких файлов, путь к файлу (строка подключения) должен быть динамическим. Для этого перейдите в свойства диспетчера соединений с плоскими файлами (нажмите F4), найдите поле Expressions и нажмите многоточие рядом с ним. В появившемся окне выберите свойство ConnectionString и выберите созданную строковую переменную FilePath. Если вы этого еще не сделали, также создайте диспетчер соединений OLE DB с базой данных, где находится таблица назначения.
  • Добавить задачу «Выполнение SQL» в поток управления. Для оператора SQL введите команду SELECT, которая возвращает столбцы идентификатора и пути из исходной таблицы в указанном порядке. В редакторе задач выберите параметр Full Result Set для свойства ResultType. На панели «Набор результатов» введите 0 в столбце «Имя результата» и добавьте переменную объекта (FileList) в поле «Имя переменной».
  • Затем добавьте цикл по каждому элементу после задачи «Выполнение SQL» и подключите ее к ней. Выберите опцию Foreach ADO Enumerator для поля перечислителя. В поле Переменная источника объекта ADO выберите переменную объекта FileList. На вкладке «Сопоставление переменных» добавьте переменную int (ID) с индексом 0 и строку FilePath Переменная с индексом 1. Это отобразит столбцы строки из текущей итерации переменных объекта в другие переменные. Хотя он использует тот же порядок, что и оператор SELECT, т. Е. Идентификатор, за которым следует столбец пути, его можно переключить, если хотите.
  • Создание задачи потока данных внутри цикла по каждому элементу. Добавьте источник плоских файлов с помощью ранее настроенного диспетчера соединений с плоскими файлами. Затем добавьте преобразование Производный столбец. Для этого добавьте два дополнительных выходных столбца. Первым выходным столбцом будет идентификатор, и в качестве выражения укажите переменную int ID с типом данных int (DT_I4). Для столбца datetime целевой таблицы в вашем примере я предполагаю, что вы хотите указать дату и время импорта файла. Для этого добавьте еще один выходной столбец в преобразование производного столбца с выражением GETDATE(), чтобы получить дату и время импорта. Это будет иметь тип данных DT_DBTIMESTAMP, который соответствует типу даты и времени в SQL Server. Если этот тип данных отличается, см. Таблицу сопоставления в документации по типу данных SSIS .
  • После производного столбца добавьте пункт назначения OLE DB. Установите целевую таблицу в качестве места назначения, и я бы рекомендовал использовать параметр быстрой загрузки, который работает как операция BULK INSERT. На панели «Сопоставления» сопоставьте производный столбец идентификатора со столбцом идентификатора таблицы назначения, производный столбец datetime со столбцом таблицы назначения, которому он соответствует, а остальные выходные столбцы источника плоских файлов - с соответствующими столбцами таблицы. таблица назначения.

Полезные ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...