SSIS Parent table 子关系迁移
SSIS Parent table Child relation migration
我正在尝试使用 SSIS 将一些数据从一个 SQL 服务器移动到我的 Destimation SQL 服务器,源有一个 table "Parent" 和 Identity字段 ID,它是 "Child" table 的外键。
1 - N 关系
问题很简单,将数据传输到另一个 SQL 仍具有父子关系的服务器的最佳方法是什么。
注意:ID(父 ID 和子 ID)都是我们不想迁移的身份字段,因为目标源不需要它们。
请分享您的意见和想法。
仅供参考:我们创建了一个执行此操作的 .Net 代码 (C#),我们有一个获取父数据的查询,一个获取子数据的查询,并使用我们加入的 linq数据,我们循环父级获取新 ID 并作为第二个 table 的引用插入。这是有效的,但我们希望在 SSIS 上创建相同的内容以便以后能够扩展。
您必须在子 Table 之前导入父 Table:
首先您必须在目标服务器上创建 Tables,您可以使用如下查询来实现此目的:
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 连接管理器(源和目标)
- 接下来您必须添加数据流任务以从源导入父 Table 数据。您必须检查
Keep Identity
选项
- 接下来您必须添加数据流任务以从源导入子 Table 数据。您必须检查
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
如果使用此解决方法,则在导入时无需遵循命令
我正在尝试使用 SSIS 将一些数据从一个 SQL 服务器移动到我的 Destimation SQL 服务器,源有一个 table "Parent" 和 Identity字段 ID,它是 "Child" table 的外键。
1 - N 关系
问题很简单,将数据传输到另一个 SQL 仍具有父子关系的服务器的最佳方法是什么。
注意:ID(父 ID 和子 ID)都是我们不想迁移的身份字段,因为目标源不需要它们。
请分享您的意见和想法。
仅供参考:我们创建了一个执行此操作的 .Net 代码 (C#),我们有一个获取父数据的查询,一个获取子数据的查询,并使用我们加入的 linq数据,我们循环父级获取新 ID 并作为第二个 table 的引用插入。这是有效的,但我们希望在 SSIS 上创建相同的内容以便以后能够扩展。
您必须在子 Table 之前导入父 Table:
首先您必须在目标服务器上创建 Tables,您可以使用如下查询来实现此目的:
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 连接管理器(源和目标)
- 接下来您必须添加数据流任务以从源导入父 Table 数据。您必须检查
Keep Identity
选项
- 接下来您必须添加数据流任务以从源导入子 Table 数据。您必须检查
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
如果使用此解决方法,则在导入时无需遵循命令