【问题标题】:SSIS Parent table Child relation migrationSSIS父表子关系迁移
【发布时间】:2017-01-15 20:43:05
【问题描述】:

我正在尝试使用 SSIS 将一些数据从一个 SQL 服务器移动到我的 Destimation SQL 服务器,源有一个表“父”,其标识字段 ID 是“子”表的外键。

1 - N 关系

问题很简单,将数据传输到仍然具有父子关系的不同 SQL Server 的最佳方法是什么。

注意:ID(父母和孩子)都是我们不想迁移的身份字段,因为目标源不需要它们。

请分享您的 cmets 和想法。

仅供参考:我们创建了一个 .Net 代码 (C#) 来执行此操作,我们有一个获取父数据的查询,一个获取子数据的查询,并使用 linq 我们连接数据并循环父级获取新 ID 并作为第二个表的参考插入。这是可行的,但我们希望在 SSIS 上创建相同的内容以便以后进行扩展。

【问题讨论】:

  • 这是一个简单的问题。正如您所提到的,在目标端 id 可能不一样,所以您正在实施什么机制来维护 c# 代码中表之间的父子关系。这将有助于 SSIS 专家给出精确的解决方案。
  • 您可能会在this 的答案中找到一些有用的东西,再说一次,也许不是。任何要求最佳解决方案的问题都必须提供适当的指标来衡量“最佳”:最少的代码行、最少的 I/O、最小的内存占用、最快的执行……。

标签: c# sql-server ssis etl


【解决方案1】:

您必须在子表之前导入父表:

  • 首先您必须在目标服务器上创建表,您可以使用如下查询来实现此目的:

    CREATE TABLE [dbo].[Tbl_Child](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [Parent_ID] [int] NULL,
        [Name] [varchar](50) NULL,
     CONSTRAINT [PK_Tbl_Child] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    CREATE TABLE [dbo].[Tbl_Parent](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [Name] [varchar](50) NULL,
     CONSTRAINT [PK_Tbl_Parent] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[Tbl_Child]  WITH CHECK ADD  CONSTRAINT [FK_Tbl_Child_Tbl_Parent] FOREIGN KEY([Parent_ID])
    REFERENCES [dbo].[Tbl_Parent] ([ID])
    GO
    
    ALTER TABLE [dbo].[Tbl_Child] CHECK CONSTRAINT [FK_Tbl_Child_Tbl_Parent]
    GO
    
  • 添加两个 OLEDB 连接管理器(源和目标)

  • 接下来,您必须添加一个 DataFlow 任务以从源导入父表数据。您必须检查Keep Identity 选项

  • 接下来,您必须添加一个 DataFlow 任务以从源导入子表数据。您必须检查Keep Identity 选项

  • 包可能如下所示

解决方法: 您可以禁用约束并导入数据,然后通过在导入前后添加 SQL 任务来启用它

禁用约束:

ALTER TABLE Tbl_Child NOCHECK CONSTRAINT FK_Tbl_Child_Tbl_Parent

启用约束:

ALTER TABLE Tbl_Child CHECK CONSTRAINT FK_Tbl_Child_Tbl_Parent

如果使用此解决方法,则在导入时无需遵循顺序

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 2019-08-06
    • 2018-11-11
    • 2018-06-21
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    相关资源
    最近更新 更多