繁体   English   中英

从CSV文件填充SQL数据库

[英]Fill SQL database from a CSV File

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

在此输入图像描述

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

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

在此输入图像描述

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

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

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

概观

  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 
  2. OLEDB目标映射OutGroupNameGroupName

在此输入图像描述

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

  • 重复使用Groupname Column完成的相同步骤:只需一个区别就是您必须在Script Component中选择EmployeeIDEmployee NameLoginName列作为Input,并在comparaison中使用ID列而不是Groupname

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

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

在此输入图像描述

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

  2. GroupName列和Get Group ID映射为输出

在此输入图像描述

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

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

在此输入图像描述

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

使用2个数据流任务

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


第二个解决方案 - 使用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 
  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] 

使用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 
  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] 

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


使用PowerShell的解决方案

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


参考

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

您可以在rextester上看到现场演示。

既然您已经知道如何导入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。 这是一个有用的选项,但显然在该组件的某个地方出了问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM