Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SSIS父表子关系迁移_C#_Sql Server_Ssis_Etl - Fatal编程技术网

C# SSIS父表子关系迁移

C# SSIS父表子关系迁移,c#,sql-server,ssis,etl,C#,Sql Server,Ssis,Etl,我试图使用SSIS将一些数据从一台SQL server移动到我的目标SQL server,源有一个表“Parent”,其标识字段ID是“Child”表的外键 1-N关系 问题很简单,将数据传输到具有父子关系的其他SQL Server的最佳方式是什么 注意:ID(父项和子项)都是我们不想迁移的标识字段,因为目标源不需要它们 请分享您的意见和想法 FYI:我们创建一个.Net代码(C#)来实现这一点,我们有一个获取父数据的查询,一个获取child数据的查询,我们使用linq连接数据,我们循环par

我试图使用SSIS将一些数据从一台SQL server移动到我的目标SQL server,源有一个表“Parent”,其标识字段ID是“Child”表的外键

1-N关系

问题很简单,将数据传输到具有父子关系的其他SQL Server的最佳方式是什么

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

请分享您的意见和想法


FYI:我们创建一个.Net代码(C#)来实现这一点,我们有一个获取父数据的查询,一个获取child数据的查询,我们使用linq连接数据,我们循环parent获取新ID并插入作为第二个表的引用。这是可行的,但我们希望在SSI上创建相同的,以便以后能够扩展。

您必须先导入父表,然后再导入子表:

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

    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连接管理器(源和目标)

  • 接下来,您必须添加一个数据流任务来从源导入父表数据。您必须选中
    keepidentity
    选项

  • 接下来,您必须添加一个数据流任务来从源导入子表数据。您必须选中
    keepidentity
    选项

  • 包可能如下所示

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

禁用约束:

ALTER TABLE Tbl_Child NOCHECK CONSTRAINT FK_Tbl_Child_Tbl_Parent
ALTER TABLE Tbl_Child CHECK CONSTRAINT FK_Tbl_Child_Tbl_Parent
启用约束:

ALTER TABLE Tbl_Child NOCHECK CONSTRAINT FK_Tbl_Child_Tbl_Parent
ALTER TABLE Tbl_Child CHECK CONSTRAINT FK_Tbl_Child_Tbl_Parent

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

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