从CSV文件填充SQL数据库

时间:2016-12-02 18:13:49

标签: sql-server csv ssis etl ssis-2012

我需要使用带有SSIS的CSV文件创建数据库。 CSV文件包含四列:

enter image description here

我需要使用该表的信息来填充我在下面的SQL中创建的三个表。

我已经意识到我需要的是使用Employee Table的一列EmployeeNumber和Group Table GroupID来填充EmployeeGroup表。为此,我认为Join Merge表是我需要的,但是我在SSIS中创建了数据流任务,结果是相同的,没有显示数据。

enter image description here

中间表是用于与其他表关联的表。

我在SSIS中创建了包,并填充了Employee和Group Tables,但没有填充EmployeeGroup表。 EmployeeGroup仅显示没有数据的EmployeeNumber和Group ID列。

我是SSIS的新手,我真的不知道还能做什么。我将非常感谢你的帮助。

3 个答案:

答案 0 :(得分:12)

概述

  1. 使用SSIS的解决方案
    • 使用3个数据流任务
    • 使用2个数据流任务
  2. 使用T-SQL的解决方案
    • 使用Microsoft.Ace.OLEDB
    • 使用Microsoft文本驱动程序
  3. 使用PowerShell的解决方案
  4. 第一个解决方案 - SSIS

    使用3个数据流任务

    这可以仅使用2个数据流任务完成,但根据问题I am new using SSIS, and I really do not know what else to do中提到的OP,我将提供最简单的解决方案,即3个DataFlow任务,以避免使用更多组件,如{ {1}}。

    解决方案概述

    因为您想要构建关系数据库并从csv中提取关系,所以您必须阅读csv 3次 - 将其视为3个单独的文件 -

    首先,你必须导入员工和组数据,然后你必须在它们之间导入关系表。

    每个导入步骤都可以在单独的数据流任务中完成

    详细解决方案

    1. 添加平面文件连接管理器(Csv文件)
    2. 添加 OLEDB连接管理器(SQL目标)
    3. 添加3 DataFlow任务,如下图所示
    4. enter image description here

      第一个数据流任务

      1. 添加平面文件源脚本组件 OLEDB目标,如下图所示
      2. enter image description here

        1. 脚本组件中,选择“组名”列作为“输入”
        2. enter image description here

          1. 选择输出缓冲区并将MultiCast更改为SynchronousInputID Property并添加类型为None
          2. 的输出列OutGroupname

            enter image description here

            1. 脚本部分中,编写以下代码:

              DT_STR
            2. OLEDB目的地地图 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 OutGroupName

            3. enter image description here

              第二个数据流任务:导入员工数据

              • 重复使用GroupName列完成的相同步骤:只需一个区别就是您必须选择GroupnameEmployeeIDEmployee Name列作为输入< em>脚本组件并在比较中使用LoginName列而不是ID

              第三个数据流任务:导入Employees_Group数据

              1. 您必须添加平面文件源查找转换 OLEDB目标
              2. enter image description here

                1. LookUp Transformation 组件中选择Groupname表作为查找表

                2. 映射Groups列并获取GroupName作为输出

                3. enter image description here

                  1. 错误输出配置中选择Group ID

                  2. Oledb目的地地图列中,如下所示

                  3. enter image description here

                    注意:Ignore Failure必须是身份(在sql server中设置)

                    使用2个数据流任务

                    您必须执行与3数据流任务解决方案相同的步骤,但不要向GroupIDGroup添加2个数据流任务,只需添加一个数据流任务,在Employee添加Flat File Source组件后复制Flow。然后,对于第一个流,使用MultiCast数据流任务中使用的相同Script ComponentOLEDB Destination,对于第二个流使用EmployeeScript Component相关到OLEDB Destination

                    第二个解决方案 - 使用TSQL

                    通过T-SQL命令将平面文件导入SQL有很多种方法

                    使用Microsoft ACE OLEDB提供程序的OPENROWSET

                    假设安装的Microsoft ACE OLEDB版本为Group且csv文件位置为Microsoft.ACE.OLEDB.12.0

                    1. 首先将数据导入员工和组表

                      C:\abc.csv
                    2. 导入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
                      
                    3. 带有Microsoft文本驱动程序的OPENROWSET

                      1. 首先将数据导入员工和组表

                        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]
                        
                      2. 导入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
                        
                      3. 注意:您可以将数据导入到临时表,然后查询此表,以避免多次连接到csv文件

                        使用PowerShell的解决方案

                        有很多方法可以将csv文件导入SQL服务器,您可以查看以下链接以获取其他信息。

                        参考

答案 1 :(得分:3)

我认为最简单的解决方案是将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

You can see a live demo on rextester.

答案 2 :(得分:3)

由于您已经知道如何导入csv并提取两个表(Employee和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

最有可能的是,您已经有类似的声明已经在为员工和集团工作。在此选项中,您可以使用相同的方式使其工作,而无需使用Join Merge。这是一个有用的选项,但显然在该组件的某个地方出了问题。