从CSV文件填充SQL数据库

HCa*_*ill 15 sql-server csv ssis etl ssis-2012

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

在此输入图像描述

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

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

在此输入图像描述

中间表是用于关联其他表的表.

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

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

Had*_*adi 12

概观

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

第一个解决方案 - SSIS

使用3个数据流任务

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

方案概述

因为你想构建一个关系数据库并从csv中提取关系,所以你必须阅读csv 3次 - 将它作为3个单独的文件来考虑 -.

首先,您必须导入Employees和Groups Data,然后您必须导入它们之间的关系表.

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

详细解决方案

  1. 添加平面文件连接管理器(Csv文件)
  2. 添加OLEDB连接管理器(SQL目标)
  3. 添加3个DataFlow Task,如下图所示

在此输入图像描述

第一个数据流任务

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

在此输入图像描述

  1. 脚本组件中,选择"组名"列作为"输入"

在此输入图像描述

  1. 选择输出缓冲区并更改SynchronousInputID PropertyNone并添加OutGroupname类型的输出列DT_STR

在此输入图像描述

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

     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
    
    Run Code Online (Sandbox Code Playgroud)
  2. OLEDB目标映射OutGroupNameGroupName

在此输入图像描述

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

  • 重复做用同样的步骤Groupname柱:有一个区别就是你要选择的EmployeeID,Employee Name,LoginName如输入列脚本组件和使用ID列,而不是Groupname列在comparaison

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

  1. 您必须添加平面文件源,查找转换,OLEDB目标

在此输入图像描述

  1. LookUp Transformation Component中,选择GroupsTable作为Lookup表

  2. 映射GroupName列和获取Group ID输出

在此输入图像描述

  1. Ignore Failure错误输出配置中选择

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

在此输入图像描述

注意:GroupID必须是Identity(在sql server中设置)

使用2个数据流任务

你必须做相同的步骤3中的数据流任务的解决方案,而不是增加2个数据流任务到GroupEmployee,只需添加一个数据流任务,并经过Flat File Source添加MultiCast组件复制的流量.然后对于第一个流使用相同Script ComponentOLEDB DestinationEmployee数据流任务中使用,并为第二个流使用Script ComponentOLEDB Destination相关Group.


第二个解决方案 - 使用TSQL

有很多方法可以通过T-SQL命令将Flat文件导入SQL

使用Microsoft ACE OLEDB提供程序的OPENROWSET

假设已安装的Microsoft ACE OLEDB版本Microsoft.ACE.OLEDB.12.0和csv文件位置相同C:\abc.csv

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

    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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 导入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]
    
    Run Code Online (Sandbox Code Playgroud)

使用Microsoft文本驱动程序的OPENROWSET

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

    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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 导入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]
    
    Run Code Online (Sandbox Code Playgroud)

注意:您可以将数据导入到临时表,然后查询此表,以避免多次连接到csv文件


使用PowerShell的解决方案

有许多方法可以将csv文件导入SQL Server,您可以查看以下链接以获取其他信息.


参考

  • 你在答案中付出了多少努力+1 (3认同)
  • 为什么不添加第三个选项Powershell? (2认同)
  • 使用Powershell(PoSh),您可以在脚本环境中利用.Net框架(思考CLR).您还可以在SQL代理作业中本机运行PoSh脚本.我一直用它来导入CSV,Excel和Access数据.它功能强大,使用简单. (2认同)