[英]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,我真的不知道还能做什么。 我将非常感谢你的帮助。
这可以仅使用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,然后您必须导入它们之间的关系表。
每个导入步骤都可以在单独的数据流任务中完成
SynchronousInputID Property
到None
,加入一个输出列OutGroupname
类型DT_STR
在“ 脚本”部分中,编写以下代码:
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目标映射OutGroupName
到GroupName
列
Groupname
Column完成的相同步骤:只需一个区别就是您必须在Script Component中选择EmployeeID
, Employee Name
, LoginName
列作为Input,并在comparaison中使用ID
列而不是Groupname
列 在LookUp Transformation Component中,选择Groups
Table作为Lookup表
将GroupName
列和Get Group ID
映射为输出
在错误输出配置中选择Ignore Failure
在Oledb目标地图列中,如下所示
注意: GroupID
必须是Identity(在sql server中设置)
您必须执行与3数据流任务解决方案相同的步骤,但不是向Group
和Employee
添加2个数据流任务,而是添加一个数据流任务,并在Flat File Source
添加MultiCast
组件以复制流。 然后,对于第一个流,使用Employee
数据流任务中使用的相同Script Component
和OLEDB Destination
,对于第二个流,使用与Group
相关的Script Component
和OLEDB Destination
。
有很多方法可以通过T-SQL命令将Flat文件导入SQL
假设安装的Microsoft ACE OLEDB版本是Microsoft.ACE.OLEDB.12.0
并且csv文件位置是C:\\abc.csv
首先将数据导入员工和组表
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]
首先将数据导入员工和组表
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文件
有许多方法可以将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
既然您已经知道如何导入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.