sql-server – 如何拆分平面文件数据并加载到数据库中的父子表?

前端之家收集整理的这篇文章主要介绍了sql-server – 如何拆分平面文件数据并加载到数据库中的父子表?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有需要导入父子表的非规范化数据(来自文件).源数据是这样的:
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

我应该使用SSIS的哪些部分,部分或策略将前三列读入父表,将第4列(电子邮件)读入子表?我有多个父键选项,我可以选择:

>直接使用帐号#作为主键
>在导入过程中使用SSIS生成的代理键
>配置身份主键

我确信我已经列出了我的主键选项,增加了难度.我有兴趣知道如何做第一个和最后一个选项 – 我将推断如何实现中间选项.再次强调,我对一个明确的SSIS解决方案感兴趣;我正在寻找一个使用SSIS语言的答案,而不是一个程序性的,技术中立的答案.

我的问题有点类似于another SO question,有一个模糊可行性的答案.我希望能给出更详细的指导.我已经知道如何通过创建一个“临时”中间步骤来解决这个问题,其中父子分离实际上是用直接sql处理的.但是,我很好奇如果没有这种中间步骤可以做到这一点.

在我看来,这种重要性是如此常见,以至于会有一种公开的公式化方法来处理它 – 这是SSIS擅长的一种技术.到目前为止,我还没有看到任何直接答案.

更新#1:根据评论,我调整了样本数据以更明显地非规范化.我还从“平面文件”中删除了“flat”,因此语义不会干扰问题.

更新#2:我已经放大了对SSIS语言解决方案的兴趣.

解决方法

以下是加载父子数据时可以考虑的一种可能选项.此选项包含两个步骤.在第一步中,读取源文件并将数据写入父表.在第二步中,再次读取源文件并使用查找转换来获取父信息,以便将数据写入子表.以下示例使用问题中提供的数据.此示例是使用SSIS 2008 R2和sql Server 2008数据库创建的.

循序渐进的过程:

>创建一个名为Source.txt的示例平面文件,如屏幕截图#1所示.
>在sql数据库中,使用sql Scripts部分下给出的脚本创建两个名为dbo.Parent和dbo.Child的表.这两个表都有一个自动生成的标识列.
>在包上,放置一个OLE DB连接以连接到sql Server和Flat File连接以读取源文件,如屏幕截图#2所示.配置平面文件连接,如屏幕截图#3 – #9所示.
>在“控制流”选项卡上,放置两个数据流任务,如屏幕截图#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所示.我们需要将电子邮件列和父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,[Account] [varchar](12) NULL,[Name] [varchar](12) NULL,[Membership] [varchar](14) NULL,CONSTRAINT [PK_Parent] PRIMARY KEY CLUSTERED ([ParentId] ASC)) ON [PRIMARY]
GO

截图#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:

猜你在找的MsSQL相关文章