如何将一个 table 中的记录集和其他记录集加载到 ssis 中的不同 table
how to load set of records in one table and others set of records to different table in ssis
我这里有一个基于场景的问题。
假设我有一个 table,它有数百万条记录,其中很少 columns.I 想根据行数将数据加载到 ssis 中的两个不同目的地,前 3 行应该转到一个 table 并且第二组三行应该转到其他 table,这应该重复,直到所有记录都加载到两个目的地。
表 1:
ID
1
2
3
4
5
6
7
8
9
10
11
12
所以第一个目标 table 应该有记录
1
2
3
7
8
9
第二个table应该有
4
5
6
10
11
12
请让我现在的方法
您可以使用 Conditional Split Transformation
。为此,
- 单击“数据流”选项卡,然后从“工具箱”中将“条件拆分”转换拖到设计图面上。
- 通过从数据源拖动连接器,将条件拆分转换连接到数据流
- 双击条件拆分转换。
- 在条件拆分转换编辑器中,通过将变量、列、函数和运算符拖动到网格中的条件列来构建要用作条件的表达式。或者,您可以在“条件”列中键入表达式。
- 点击确定。
在您的情况下,流量条件可以是 ID % != 0
和 ID % 3 == 0
解决方案(1):使用SQL (DENSE_RANK(), MODULO) + 条件分割
您可以使用与 OLEDB 源类似的 SQL 命令,它会生成一个根据行号拆分数据的列。
SELECT ID, DENSE_RANK() OVER(PARTITION BY ID % 3 ORDER BY ID) % 2 as DestinationTable
FROM Table1 ORDER BY ID
之后,您可以使用条件拆分组件将流拆分到 rwo 目的地。
注意:处理海量数据时,一定要确保已经创建了相应的索引)
方案(二):使用脚本组件+条件拆分
- 首先你有你需要的 OLEDB 连接管理器(源和目标连接)
- 添加数据流任务
- 在数据流任务中,添加一个从源 Table
读取的 OLEDB Source
- 在需要实现所描述逻辑的位置添加脚本组件,并且必须添加包含目标 Table ID 的输出列。
脚本代码(VB.NET)
Public Class ScriptMain
Inherits UserComponent
Private RowCounter As Integer = 0
Private DestinationTableID As Integer = 1
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
RowCounter += 1
Row.DestinationTable = DestinationTableID
If RowCounter = 3 Then
RowCounter = 0
If DestinationTableID = 1 Then
DestinationTableID = 2
Else
DestinationTableID = 1
End If
End If
End Sub
End Class
- 添加条件拆分,根据 Table ID 拆分流(如果 Table ID == 1 则将数据插入目标 1,否则目标 2)
- 将每个流连接到相应的目标
备注
如果您的目标是无条件地将数据分发到两个目的地,您只能使用条件拆分转换使用(模)使用以下表达式拆分数据 (其中 2 是您需要的目的地数量)
Row.ID % 2 == 0
或者您可以使用 Balanced Data Distributor 来实现,无需任何手动实施。
我这里有一个基于场景的问题。 假设我有一个 table,它有数百万条记录,其中很少 columns.I 想根据行数将数据加载到 ssis 中的两个不同目的地,前 3 行应该转到一个 table 并且第二组三行应该转到其他 table,这应该重复,直到所有记录都加载到两个目的地。
表 1:
ID
1
2
3
4
5
6
7
8
9
10
11
12
所以第一个目标 table 应该有记录
1
2
3
7
8
9
第二个table应该有
4
5
6
10
11
12
请让我现在的方法
您可以使用 Conditional Split Transformation
。为此,
- 单击“数据流”选项卡,然后从“工具箱”中将“条件拆分”转换拖到设计图面上。
- 通过从数据源拖动连接器,将条件拆分转换连接到数据流
- 双击条件拆分转换。
- 在条件拆分转换编辑器中,通过将变量、列、函数和运算符拖动到网格中的条件列来构建要用作条件的表达式。或者,您可以在“条件”列中键入表达式。
- 点击确定。
在您的情况下,流量条件可以是 ID % != 0
和 ID % 3 == 0
解决方案(1):使用SQL (DENSE_RANK(), MODULO) + 条件分割
您可以使用与 OLEDB 源类似的 SQL 命令,它会生成一个根据行号拆分数据的列。
SELECT ID, DENSE_RANK() OVER(PARTITION BY ID % 3 ORDER BY ID) % 2 as DestinationTable
FROM Table1 ORDER BY ID
之后,您可以使用条件拆分组件将流拆分到 rwo 目的地。
注意:处理海量数据时,一定要确保已经创建了相应的索引)
方案(二):使用脚本组件+条件拆分
- 首先你有你需要的 OLEDB 连接管理器(源和目标连接)
- 添加数据流任务
- 在数据流任务中,添加一个从源 Table 读取的
- 在需要实现所描述逻辑的位置添加脚本组件,并且必须添加包含目标 Table ID 的输出列。
OLEDB Source
脚本代码(VB.NET)
Public Class ScriptMain
Inherits UserComponent
Private RowCounter As Integer = 0
Private DestinationTableID As Integer = 1
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
RowCounter += 1
Row.DestinationTable = DestinationTableID
If RowCounter = 3 Then
RowCounter = 0
If DestinationTableID = 1 Then
DestinationTableID = 2
Else
DestinationTableID = 1
End If
End If
End Sub
End Class
- 添加条件拆分,根据 Table ID 拆分流(如果 Table ID == 1 则将数据插入目标 1,否则目标 2)
- 将每个流连接到相应的目标
备注
如果您的目标是无条件地将数据分发到两个目的地,您只能使用条件拆分转换使用(模)使用以下表达式拆分数据 (其中 2 是您需要的目的地数量)
Row.ID % 2 == 0
或者您可以使用 Balanced Data Distributor 来实现,无需任何手动实施。