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

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列(电子邮件)读入子表?我可以选择父键的几个选项:

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

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

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

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

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

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

小智 31

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

循序渐进的过程:

  1. 创建一个示例平面文件Source.txt,如屏幕截图#1所示.

  2. 在SQL数据库中,创建两个名为dbo.Parentdbo.Child使用SQL Scripts部分下给出的脚本的表.这两个表都有一个自动生成的标识列.

  3. 在包上,放置一个OLE DB connection连接到SQL Server并Flat File connection读取源文件,如屏幕截图#2所示.配置平面文件连接,如屏幕截图#3 - #9所示.

  4. 在"控制流"选项卡上,放置两个Data Flow Tasks,如屏幕截图#10所示.

  5. 在名为Parent的数据流任务中,放置一个Flat File源,Sort转换和一个OLE DB目标,如屏幕截图#11所示.

  6. 配置平面文件源,如屏幕截图#12和#13所示.我们需要阅读平面文件源.

  7. 配置排序转换,如屏幕截图#14所示.我们需要消除重复值,以便只将唯一记录插入父表中dbo.Parent.

  8. 配置ole db目标,如屏幕截图#15和#16所示.我们需要将数据插入父表中dbo.Parent.

  9. 在名为Child的数据流任务中,放置一个平面文件源,查找转换和一个OLE DB目标,如屏幕截图#17所示.

  10. 配置平面文件源,如屏幕截图#12和#13所示.此配置与先前数据流任务中的平面文件源相同.

  11. 配置查找转换,如屏幕截图#18和#20所示.我们需要dbo.Parent使用文件中存在的其他键列从表中查找父ID .这里的关键列是帐户,名称和电子邮件.如果文件恰好具有唯一列,则可以单独使用该列来获取父ID.

  12. 配置ole db目标,如屏幕截图#21和#22所示.我们需要将Email列和Parent id一起插入表中dbo.Child.

  13. 屏幕截图#23显示了包执行表中的数据.

  14. 屏幕截图#24和#25显示了示例包执行.

  15. 屏幕截图#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:

1

截图#2:

2

截图#3:

3

截图#4:

4

截图#5:

五

截图#6:

6

截图#7:

7

截图#8:

8

截图#9:

9

截图#10:

10

截图#11:

11

截图#12:

12

截图#13:

13

截图#14:

14

截图#15:

15

截图#16:

16

截图#17:

17

截图#18:

18

截图#19:

19

截图#20:

20

屏幕截图#21:

21

截图#22:

22

屏幕截图#23:

23

屏幕截图#24:

24

截图#25:

25

屏幕截图#26:

26

  • 神的圣洁母亲.我从来没有见过如此详细的答案,如此精心呈现.你太不可思议了! (5认同)