我需要使用带有 SSIS 的 CSV 文件创建一个数据库。 CSV 文件包括四列:
我需要使用该表的信息来填充我在下面用 SQL 创建的三个表。
我意识到我需要的是使用员工表的一列,EmployeeNumber
,和组表,GroupID
, 填充 EmployeeGroup 表。为此,我认为Join Merge表是我需要的,但我在SSIS中创建了数据流任务,结果相同,没有显示数据。
中间的表是用来关联其他表的表。
我在 SSIS 中创建了包,并且填充了 Employee 和 Group 表,但没有填充 EmployeeGroup 表。 EmployeeGroup 将只显示没有数据的 EmployeeNumber 和 Group ID 列。
我是使用 SSIS 的新手,我真的不知道还能做什么。我将非常感谢您的帮助。
最佳答案
概述
第一个解决方案 - 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 个单独的文件 -。
首先你必须导入员工和组数据,然后你必须导入它们之间的关系表。
每个导入步骤都可以在单独的数据流任务中完成
详细解决方案
第一个数据流任务
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
OutGroupName
至 GroupName
栏目 第二个数据流任务:导入员工数据
Groupname
相同的步骤列:有一个区别,就是您必须选择 EmployeeID
, Employee Name
, LoginName
列作为脚本组件中的输入并使用 ID
列而不是 Groupname
对比栏目第三个数据流任务:导入Employees_Group数据
Groups
表作为查找表 GroupName
列和获取 Group ID
作为输出 Ignore Failure
在错误输出配置中 注:
GroupID
必须是身份(在 sql server 中设置)使用 2 个数据流任务
您必须执行与 3 个数据流任务解决方案相同的步骤,但不是将 2 个数据流任务添加到
Group
和 Employee
,只需添加一个数据流任务,并在Flat File Source
之后添加 MultiCast
组件来复制流。然后对于第一个流程使用相同的 Script Component
和 OLEDB Destination
用于 Employee
数据流任务,对于第二个流使用 Script Component
和 OLEDB Destination
相关 Group
.第二种解决方案 - 使用 TSQL
有很多方法可以通过 T-SQL 命令将平面文件导入 SQL
与 Microsoft ACE OLEDB 提供程序的 OPENROWSET
假设安装的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
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
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
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 服务器,您可以查看以下链接以获取更多信息。
引用
关于sql-server - 从 CSV 文件填充 SQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40938557/