如何将一个表中的记录集和其他记录集加载到sis中的不同表

时间:2019-01-06 22:40:57

标签: sql sql-server ssis etl ssis-2012

我在这里有一个基于场景的问题。 假设我有一个表,它是一百万个记录的几列,我想根据行数将数据加载到sis中的两个不同的目的地,前三行应该进入一个表,第二组三行应该进入另一个表直到所有记录都加载到两个目的地为止。

表1:

ID
1
2
3
4
5
6
7
8
9
10
11
12

所以第一个目标表应该有记录

1
2
3
7
8
9

第二张桌子应该有

4
5
6
10
11
12

请让我现在使用方法

2 个答案:

答案 0 :(得分:1)

您可以使用Conditional Split Transformation。为此,

  • 单击“数据流”选项卡,然后从“工具箱”中将“条件拆分”转换拖动到设计图面上。
  • 通过从数据源拖动连接器将条件拆分转换连接到数据流
  • 双击条件拆分转换。
  • 在“条件拆分转换编辑器”中,通过将变量,列,函数和运算符拖到网格中的“条件”列,构建用作条件的表达式。或者,您可以在“条件”列中键入表达式。
  • 单击确定。

在您的情况下,流量条件可以为ID % != 0ID % 3 == 0

答案 1 :(得分:1)

解决方案(1):使用SQL(DENSE_RANK(),MODULO)+条件拆分

您可以使用与OLEDB Source相似的SQL命令,它将生成一列,该列根据行号拆分数据。

SELECT ID, DENSE_RANK() OVER(PARTITION BY ID % 3 ORDER BY ID) % 2 as DestinationTable 
FROM Table1 ORDER BY ID

之后,您可以使用条件拆分组件将流拆分为rwo目标。

注意:处理大量数据时,必须确保已创建相应的索引)


解决方案(2):使用脚本组件+有条件拆分

  1. 首先,您具有需要的OLEDB连接管理器(源连接和目标连接)
  2. 添加数据流任务
  3. 在数据流任务中,添加一个OLEDB Source,该数据将从源表中读取
  4. 添加脚本组件,您需要在其中实现所描述的逻辑,并且必须添加包含目标表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
  1. 添加一个条件拆分,该拆分基于表ID (如果表ID == 1则将数据插入目标1否则将目标2插入)以拆分流
  2. 将每个流连接到相应的目的地

备注

如果您的目标是在没有任何条件的情况下将数据分发到两个目标,则只能使用条件拆分转换使用以下表达式(以2为目标数)对(模)数据进行拆分。您需要)

Row.ID % 2 == 0

或者您可以使用Balanced Data Distributor来实现这一目标,而无需任何手动实施。