Заполнить базу данных SQL из файла CSV

Мне нужно создать базу данных, используя CSV файл с SSIS. Файл CSV содержит четыре столбца:

введите описание изображения здесь

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

Я понял, что мне нужно использовать один столбец Employee Table, EmployeeNumber и Group Table, GroupID, чтобы заполнить таблицу EmployeeGroup. Для этого я думал, что таблица Join Merge - это то, что мне нужно, но я создал задачу потока данных в SSIS, и результаты совпадают, данные не отображаются.

введите описание изображения здесь

Средняя таблица - это та, которая используется для связи других таблиц.

Я создал пакет в SSIS, заполнены таблицы Employee и Group, но таблица EmployeeGroup - нет. EmployeeGroup будет показывать столбцы EmployeeNumber и Group ID без данных.

Я новичок в SSIS, и я действительно не знаю, что еще делать. Я буду очень признателен за вашу помощь.

Ответы

Ответ 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, как показано на рисунке ниже.

введите описание изображения здесь

  1. В Script Компонент выберите столбец Имя группы в качестве ввода

введите описание изображения здесь

  1. Выберите выходной буфер и измените SynchronousInputID Property на None и добавьте выходной столбец OutGroupname с типом DT_STR

введите описание изображения здесь

  1. В разделе 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
    
  2. На карте назначения OLEDB OutGroupname - GroupName Столбец

введите описание изображения здесь

Вторая задача потока данных: импорт данных сотрудников

  • Повторите те же шаги, что и в столбце GroupName. Столбец: с единственной разницей вам нужно выбрать столбцы EmployeeID, Employee Name, LoginName в качестве ввода в Script Component и использовать ID Столбец вместо столбца GroupName в компаранионе

Третья задача потока данных: импортировать данные Employees_Group

  • Вам нужно добавить источник плоского файла, преобразование Look Up, назначение OLEDB

введите описание изображения здесь

  1. В компоненте преобразования LookUp выберите Groups Таблица в качестве таблицы поиска

  2. Карта GroupName Столбцы и Get Group ID в качестве вывода

введите описание изображения здесь

  1. Выберите Ignore Failure в конфигурации вывода ошибок

  2. В столбцах карты 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-сервер, вы можете проверить следующие ссылки для дополнительной информации.


Ссылки

Ответ 2

Я думаю, что самым простым решением было бы импортировать CSV в плоскую промежуточную таблицу, а затем использовать несколько операторов insert into...select для заполнения целевых таблиц. Предполагая, что вы знаете, как импортировать в плоский стол, остальное довольно просто:

INSERT INTO Employee (EmployeeNumber, EmployeeName, LoginName)
SELECT DISTINCT EmployeeNumber, EmployeeName, LoginName
FROM Stage

INSERT INTO [Group] (GroupName)
SELECT DISTINCT GroupName 
FROM Stage

INSERT INTO EmployeeGroup(EmployeeNumber, GroupId)
SELECT DISTINCT EmployeeNumber, GroupId
FROM Stage s
INNER JOIN [Group] g ON s.GroupName = g.GroupName

Вы можете увидеть живую демонстрацию в реестре.

Ответ 3

Поскольку вы уже знаете, как импортировать csv и извлечь две таблицы (Employee and Group), я предлагаю вам просто заполнить EmployeeGroup таким же образом. И прекратите использование group_id. Если вы это сделаете, вы получите инструкции sql, например:

select [Employee Number], [Employee Name], LoginName from Employee
select [Group Name] from Employee
select distinct [Employee Number], [Group Name] from Employee

Скорее всего, у вас будут аналогичные заявления, уже работающие для Employee и Group. В этом случае вы можете заставить его работать таким же образом, не используя Join Merge. Это полезный вариант, но, очевидно, где-то в этом компоненте что-то пошло не так.