Ответ 1
Обзор
- Решения с использованием SSIS
- Использование 3 задач потока данных
- Использование двух задач потока данных
- Решения, использующие T-SQL
- Использование Microsoft.Ace.OLEDB
- Использование текстового драйвера Microsoft
- Решения, использующие PowerShell
1-е решение - SSIS
Использование 3 задач потока данных
Это можно сделать, используя только 2 задачу потока данных, но в соответствии с тем, что ОП упоминает в вопросе I am new using SSIS, and I really do not know what else to do
, я предоставит самое легкое решение, которое представляет собой 3 задачи DataFlow, чтобы избежать использования большего количества компонентов, таких как MultiCast
.
Обзор решений
Поскольку вы хотите создать реляционную базу данных и извлечь отношения из csv, вам нужно прочитать csv 3 раза - считайте это 3 разделенными файлами -.
Сначала вам нужно импортировать данные сотрудников и групп, а затем импортировать таблицу отношений между ними.
Каждый шаг импорта может быть выполнен в отдельной задаче потока данных
Подробное решение
- Добавить диспетчер соединений с плоскими файлами (файл Csv)
- Добавить диспетчер соединений OLEDB (назначение SQL)
- Добавьте 3 задачи DataFlow, как показано ниже.
Первая задача потока данных
- Добавьте источник плоского файла, компонент Script, назначение OLEDB, как показано на рисунке ниже.
- В Script Компонент выберите столбец Имя группы в качестве ввода
- Выберите выходной буфер и измените
SynchronousInputID Property
наNone
и добавьте выходной столбецOutGroupname
с типомDT_STR
-
В разделе Script напишите следующий код:
Imports System.Collections.Generic Private m_List As New List(Of String) Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) If Not Row.GroupName_IsNull AndAlso Not String.IsNullOrEmpty(Row.GroupName.Trim) Then If Not m_List.Contains(Row.GroupName.Trim) Then m_List.Add(Row.GroupName.Trim) CreateOutputRows(Row.GroupName.Trim) End If End If End Sub Public Sub CreateOutputRows(ByVal strValue As String) Output0Buffer.AddRow() Output0Buffer.OutGroupName = strValue End Sub
-
На карте назначения OLEDB
OutGroupname
-GroupName
Столбец
Вторая задача потока данных: импорт данных сотрудников
- Повторите те же шаги, что и в столбце
GroupName
. Столбец: с единственной разницей вам нужно выбрать столбцыEmployeeID
,Employee Name
,LoginName
в качестве ввода в Script Component и использоватьID
Столбец вместо столбцаGroupName
в компаранионе
Третья задача потока данных: импортировать данные Employees_Group
- Вам нужно добавить источник плоского файла, преобразование Look Up, назначение OLEDB
-
В компоненте преобразования LookUp выберите
Groups
Таблица в качестве таблицы поиска -
Карта
GroupName
Столбцы и GetGroup ID
в качестве вывода
-
Выберите
Ignore Failure
в конфигурации вывода ошибок -
В столбцах карты Oledb Destination следующие:
Примечание: GroupID
должен быть идентификатором (установить его на сервере sql)
Использование 2 задач потока данных
Вам нужно выполнить те же действия, что и решение 3 Задачи потока данных, но вместо добавления двух задач потока данных в Group
и Employee
просто добавьте одну задачу потока данных, а после Flat File Source
добавьте MultiCast
для дублирования потока. Затем для первого потока используйте те же Script Component
и OLEDB Destination
, используемые в Employee
Задаче потока данных, а для второго потока используйте Script Component
и OLEDB Destination
, связанные с Group
.
Второе решение - использование TSQL
Существует много способов импорта Flat файла в SQL с помощью команд T-SQL
OPENROWSET с поставщиком OLEDB Microsoft ACE
Предполагая, что установленная версия Microsoft ACE OLEDB Microsoft.ACE.OLEDB.12.0
и что расположение файла csv C:\abc.csv
-
Сначала импортируйте данные в таблицу Employee и Group
INSERT INTO [GROUP] ([Group Name]) SELECT [Group Name] FROM OPENROWSET ( 'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\;IMEX=1;','SELECT * FROM abc.csv' ) t INSERT INTO [Employee] ([Employee Number],[Employee Name],[LoginName]) SELECT [Employee Number],[Employee Name],[LoginName] FROM OPENROWSET ( 'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\;IMEX=1;','SELECT * FROM abc.csv' ) t
-
Импортировать данные Employee_Group
INSERT INTO [EmployeeGroup] ([Employee Number],[GroupID]) SELECT t1.[Employee Number],t2.[GroupID] FROM OPENROWSET ( 'Microsoft.ACE.OLEDB.12.0','Text;Database=C:\;IMEX=1;','SELECT * FROM abc.csv' ) t1 INNER JOIN GROUP t2 ON t1.[Group Name] = T2.[Group Name]
OPENROWSET с текстовым драйвером Microsoft
-
Сначала импортируйте данные в таблицу Employee и Group
INSERT INTO [GROUP] ([Group Name]) SELECT [Group Name] FROM OPENROWSET ( 'MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)}; DefaultDir=C:\;', 'SELECT * FROM abc.csv' ) t INSERT INTO [Employee] ([Employee Number],[Employee Name],[LoginName]) SELECT [Employee Number],[Employee Name],[LoginName] FROM OPENROWSET ( 'MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)}; DefaultDir=C:\;', 'SELECT * FROM abc.csv' ) t
-
Импортировать данные Employee_Group
INSERT INTO [EmployeeGroup] ([Employee Number],[GroupID]) SELECT t1.[Employee Number],t2.[GroupID] FROM OPENROWSET ( 'MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)}; DefaultDir=C:\;', 'SELECT * FROM abc.csv' ) t1 INNER JOIN GROUP t2 ON t1.[Group Name] = T2.[Group Name]
Примечание. Вы можете импортировать данные в промежуточную таблицу, а затем запрашивать эту таблицу, чтобы избежать многократного подключения к файлу csv
Решения, использующие PowerShell
Существует много способов импорта csv файлов на SQL-сервер, вы можете проверить следующие ссылки для дополнительной информации.
- Четыре простых способа импорта CSV файлов на SQL Server с помощью PowerShell
- Как импортировать данные из .csv в SQL Server с помощью PowerShell?