我需要使用带有SSIS的CSV文件创建数据库。 CSV文件包含四列:
我需要使用该表的信息来填充我在下面的SQL中创建的三个表。
我已经意识到我需要的是使用Employee Table的一列EmployeeNumber
和Group Table GroupID
来填充EmployeeGroup表。为此,我认为Join Merge表是我需要的,但是我在SSIS中创建了数据流任务,结果是相同的,没有显示数据。
中间表是用于与其他表关联的表。
我在SSIS中创建了包,并填充了Employee和Group Tables,但没有填充EmployeeGroup表。 EmployeeGroup仅显示没有数据的EmployeeNumber和Group ID列。
我是SSIS的新手,我真的不知道还能做什么。我将非常感谢你的帮助。
答案 0 :(得分:12)
这可以仅使用2个数据流任务完成,但根据问题I am new using SSIS, and I really do not know what else to do
中提到的OP,我将提供最简单的解决方案,即3个DataFlow任务,以避免使用更多组件,如{ {1}}。
因为您想要构建关系数据库并从csv中提取关系,所以您必须阅读csv 3次 - 将其视为3个单独的文件 - 。
首先,你必须导入员工和组数据,然后你必须在它们之间导入关系表。
每个导入步骤都可以在单独的数据流任务中完成
MultiCast
更改为SynchronousInputID Property
并添加类型为None
OutGroupname
醇>
在脚本部分中,编写以下代码:
DT_STR
在 OLEDB目的地地图 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
至OutGroupName
列
GroupName
列完成的相同步骤:只需一个区别就是您必须选择Groupname
,EmployeeID
,Employee Name
列作为输入< em>脚本组件并在比较中使用LoginName
列而不是ID
列在 LookUp Transformation 组件中选择Groupname
表作为查找表
映射Groups
列并获取GroupName
作为输出
在错误输出配置中选择Group ID
在 Oledb目的地地图列中,如下所示
注意:Ignore Failure
必须是身份(在sql server中设置)
您必须执行与3数据流任务解决方案相同的步骤,但不要向GroupID
和Group
添加2个数据流任务,只需添加一个数据流任务,在Employee
添加Flat File Source
组件后复制Flow。然后,对于第一个流,使用MultiCast
数据流任务中使用的相同Script Component
和OLEDB Destination
,对于第二个流使用Employee
和Script Component
相关到OLEDB Destination
。
通过T-SQL命令将平面文件导入SQL有很多种方法
假设安装的Microsoft ACE OLEDB版本为Group
且csv文件位置为Microsoft.ACE.OLEDB.12.0
首先将数据导入员工和组表
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
首先将数据导入员工和组表
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]
导入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
注意:您可以将数据导入到临时表,然后查询此表,以避免多次连接到csv文件
有很多方法可以将csv文件导入SQL服务器,您可以查看以下链接以获取其他信息。
答案 1 :(得分:3)
我认为最简单的解决方案是将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
答案 2 :(得分:3)
由于您已经知道如何导入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。这是一个有用的选项,但显然在该组件的某个地方出了问题。