sql-server - 从 CSV 文件填充 SQL 数据库

标签 sql-server csv ssis etl ssis-2012

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

enter image description here

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

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

enter image description here

中间的表是用来关联其他表的表。

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

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

最佳答案

概述

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

  • 第一个解决方案 - SSIS

    使用 3 个数据流任务

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

    解决方案概述

    因为你想建立一个关系数据库并从 csv 中提取关系,你必须阅读 csv 3 次 - 将其视为 3 个单独的文件 -。

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

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

    详细解决方案
  • 添加平面文件连接管理器(Csv 文件)
  • 添加 OLEDB 连接管理器(SQL 目标)
  • 添加 3 个 DataFlow 任务,如下图所示

  • enter image description here

    第一个数据流任务
  • 添加平面文件源、脚本组件、OLEDB 目标,如下图所示

  • enter image description here
  • 在脚本组件中,选择 Group Name 列作为 Input

  • enter image description here
  • 选择输出缓冲区并更改 SynchronousInputID PropertyNone并添加一个输出列 OutGroupname带类型 DT_STR

  • enter image description here
  • 在脚本部分编写以下代码:
     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 目的地 map OutGroupNameGroupName栏目

  • enter image description here

    第二个数据流任务:导入员工数据
  • 重复与 Groupname 相同的步骤列:有一个区别,就是您必须选择 EmployeeID , Employee Name , LoginName列作为脚本组件中的输入并使用 ID列而不是 Groupname对比栏目

  • 第三个数据流任务:导入Employees_Group数据
  • 您必须添加平面文件源、查找转换、OLEDB 目标

  • enter image description here
  • 在查找转换组件中选择 Groups表作为查找表
  • map GroupName列和获取 Group ID作为输出

  • enter image description here
  • 选择 Ignore Failure在错误输出配置中
  • 在 Oledb 目标 map 列中,如下

  • enter image description here

    注:GroupID必须是身份(在 sql server 中设置)

    使用 2 个数据流任务

    您必须执行与 3 个数据流任务解决方案相同的步骤,但不是将 2 个数据流任务添加到 GroupEmployee ,只需添加一个数据流任务,并在Flat File Source之后添加 MultiCast组件来复制流。然后对于第一个流程使用相同的 Script ComponentOLEDB Destination用于 Employee数据流任务,对于第二个流使用 Script ComponentOLEDB Destination相关 Group .

    第二种解决方案 - 使用 TSQL

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

    与 Microsoft ACE OLEDB 提供程序的 OPENROWSET

    假设安装的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]
    

  • 带有 Microsoft 文本驱动程序的 OPENROWSET
  • 首先将数据导入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 服务器,您可以查看以下链接以获取更多信息。
  • Four Easy Ways to Import CSV Files to SQL Server with PowerShell
  • How to import data from .csv in SQL Server using PowerShell?


  • 引用
  • OPENROWSET (Transact-SQL)
  • T-SQL – Read CSV files using OpenRowSet
  • Import error using Openrowset
  • 关于sql-server - 从 CSV 文件填充 SQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40938557/

    相关文章:

    python - 从 csv 行中删除双引号

    sql-server - 集成服务目录文件夹权限已更改

    ssis - SSDT 2017 安装失败无法打开配置注册表项

    sql-server - SSIS 中 bool 值的问题

    sql-server - 从 SSIS 运行时,存储过程返回架构版本更改错误,但直接运行时则不会

    vb.net - 在 vb.net 中读取 csv 文件

    在不知道其中的 csv 文件名的情况下读取 R 中的 zip 文件

    SQL Server - 返回 sysobjects 的架构

    sql-server - 登录 azure sql 数据库

    c# - ssis 脚本将 System.DateTime 转换为 DT_DBTIMESTAMP 但不转换为 DT_DBTIMESTAMP2