gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:10:25 24 4
gpt4 key购买 nike

我需要使用带有 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com