Итерация столбцов таблицы SQL Server с помощью цикла в Visual Studio SSIS
Я строю простой проект служб SSIS с использованием Visual Studio, которому необходимо скопировать стандартизированный столбец из сотен плоских файлов в соответствующие строки в таблицу SQL Server.
Все плоские файлы имеют одинаковый формат и помещаются в папку в алфавитном порядке, которая проходит по петле и имеет один столбец, скопированный на файл, в следующий доступный столбец таблицы SQL Server.
Процесс зацикливания следует этому руководству. Результаты предназначены для работы следующим образом:
file_1
---------------------
col_1 col_2 col_3
----- ----- -----
1 a d
2 b e
3 c f
file_2
---------------------
col_1 col_2 col_3
----- ----- ------
1 g j
2 h k
3 i l
Table_1
-------------------------------
col_1 file1_Col2 file2_col2
----- ---------- ----------
1 a g
2 b h
3 c i
Проблема возникает в том, как сопоставить один и тот же столбец каждого плоского файла со следующим столбцом таблицы SQL Server. Мне интересно, возможно ли создать строковую переменную, которая могла бы использоваться в качестве указателя на следующий столбец или есть свойство, которое я мог бы настроить для достижения этого эффекта?
2 ответа
Вы можете сделать обходной путь для достижения этой цели:
- В контейнере цикла foreach добавьте задачу потока данных
- В Задаче DataFlow добавьте Источник Плоского файла, Назначение OLE DB (как объяснено в предоставленной вами ссылке)
- Добавьте компонент сценария между источником и назначением
- В компоненте Script вы должны выбрать Column9 как Input
- На вкладке "Вход и выход" добавьте выходные столбцы в "Выходной 0" (необходимо добавить все столбцы, найденные в целевой таблице)
- В ReadOnly Variables добавьте переменную, которая содержит имя файла
- В компоненте сценария на этапе PreExecute прочитайте имя файла из переменной ssis и получите номер файла (т. Е. Если file2, то number =2))
- Динамически назначайте значение для выходных столбцов сценария (следуйте моему ответу @ Как я могу выполнить цикл по столбцам по имени в компоненте сценария служб SSIS?)
- Сопоставить все выходные столбцы с соответствующими столбцами в месте назначения
Примечание: это создаст несколько строк для каждого файла:
Table_1
-------------------------------
col_1 file1_Col2 file2_col2
----- ---------- ----------
1 a
2 b
3 c
1 g
2 h
3 i
Поэтому необходимо, чтобы все данные были импортированы в промежуточную таблицу, а затем после импорта всех файлов необходимо вставить данные в таблицу назначения:
Сначала вставьте строки, которые содержат только значения col1, затем обновите строки из таблицы, где значения не равны NULL.
Если вы используете контейнер цикла для перебора файлов, вы можете
- Установите переменные с именами столбцов и последним значением, используя задачу выражения
- Создайте поток данных и внутри него создайте ADO.Net Destination
- В свойствах потока данных вы можете использовать выражения для передачи запроса - свойство будет называться как-то вроде [Name Of Ado.Net].[SqlCommand], а значение будет представлять собой конкатенацию вашего оператора вставки с вашими переменными.
Надеюсь это не слишком абстрактно