Bre*_*ias 7 sql-server import ssis etl sql-server-2008
我有需要导入父子表的非规范化数据(来自文件).源数据是这样的:
Account# Name Membership Email
101 J Burns Gold alpha@foo.com
101 J Burns Gold bravo@foo.com
101 J Burns Gold charlie@yay.com
227 H Gordon Silver red@color.com
350 B Clyde Silver italian@food.com
350 B Clyde Silver mexican@food.com
Run Code Online (Sandbox Code Playgroud)
我应该使用SSIS的哪些部分,部分或策略将前三列读入父表,将第4列(电子邮件)读入子表?我可以选择父键的几个选项:
我确定我已经按照增加的难度顺序列出了我的主键选项.我有兴趣知道如何做第一个和最后一个选项 - 我将推断如何实现中间选项.再次强调,我对一个明确的SSIS解决方案很感兴趣; 我正在寻找一个使用SSIS语言的答案,而不是一个程序性的,技术中立的答案.
我的问题有点类似于另一个SO问题,有一个模糊可行性的答案.我希望能给出更详细的指导.我已经知道如何通过创建一个"临时"中间步骤来解决这个问题,其中父子分离实际上是用直接SQL处理的.但是,我很好奇如果没有这种中间步骤可以做到这一点.
在我看来,这种导入是如此常见,以至于会有一种公开的公式化方法来处理它 - 这是SSIS擅长的一种技术.到目前为止,我还没有看到任何直接答案.
Update #1
:根据评论,我调整了样本数据,使其更加明显地非规范化.我还从"平面文件"中删除了"flat",因此语义不会干扰问题.
Update #2
:我已经放大了对SSIS语言解决方案的兴趣.
小智 31
以下是加载父子数据时可以考虑的一种可能选项.此选项包含两个步骤.在第一步骤中,读出的源文件,并写入数据到父表中.在第二个步骤中,再次读取源文件,然后使用查找转换,从而将数据写入到子表来获取父信息.以下示例使用问题中提供的数据.此示例是使用SSIS 2008 R2和SQL Server 2008数据库创建的.
循序渐进的过程:
创建一个示例平面文件Source.txt
,如屏幕截图#1所示.
在SQL数据库中,创建两个名为dbo.Parent
并dbo.Child
使用SQL Scripts部分下给出的脚本的表.这两个表都有一个自动生成的标识列.
在包上,放置一个OLE DB connection
连接到SQL Server并Flat File connection
读取源文件,如屏幕截图#2所示.配置平面文件连接,如屏幕截图#3 - #9所示.
在"控制流"选项卡上,放置两个Data Flow Tasks
,如屏幕截图#10所示.
在名为Parent的数据流任务中,放置一个Flat File源,Sort转换和一个OLE DB目标,如屏幕截图#11所示.
配置平面文件源,如屏幕截图#12和#13所示.我们需要阅读平面文件源.
配置排序转换,如屏幕截图#14所示.我们需要消除重复值,以便只将唯一记录插入父表中dbo.Parent
.
配置ole db目标,如屏幕截图#15和#16所示.我们需要将数据插入父表中dbo.Parent
.
在名为Child的数据流任务中,放置一个平面文件源,查找转换和一个OLE DB目标,如屏幕截图#17所示.
配置平面文件源,如屏幕截图#12和#13所示.此配置与先前数据流任务中的平面文件源相同.
配置查找转换,如屏幕截图#18和#20所示.我们需要dbo.Parent
使用文件中存在的其他键列从表中查找父ID .这里的关键列是帐户,名称和电子邮件.如果文件恰好具有唯一列,则可以单独使用该列来获取父ID.
配置ole db目标,如屏幕截图#21和#22所示.我们需要将Email列和Parent id一起插入表中dbo.Child
.
屏幕截图#23显示了包执行前表中的数据.
屏幕截图#24和#25显示了示例包执行.
屏幕截图#26显示了包执行后表中的数据.
希望有所帮助.
SQL脚本:
CREATE TABLE [dbo].[Child](
[ChildId] [int] IDENTITY(1,1) NOT NULL,
[ParentId] [int] NULL,
[Email] [varchar](21) NULL,
CONSTRAINT [PK_Child] PRIMARY KEY CLUSTERED ([ChildId] ASC)) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Parent](
[ParentId] [int] IDENTITY(1,1) NOT NULL,
[Account] [varchar](12) NULL,
[Name] [varchar](12) NULL,
[Membership] [varchar](14) NULL,
CONSTRAINT [PK_Parent] PRIMARY KEY CLUSTERED ([ParentId] ASC)) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
截图#1:
截图#2:
截图#3:
截图#4:
截图#5:
截图#6:
截图#7:
截图#8:
截图#9:
截图#10:
截图#11:
截图#12:
截图#13:
截图#14:
截图#15:
截图#16:
截图#17:
截图#18:
截图#19:
截图#20:
屏幕截图#21:
截图#22:
屏幕截图#23:
屏幕截图#24:
截图#25:
屏幕截图#26:
归档时间: |
|
查看次数: |
14419 次 |
最近记录: |