【问题标题】:how to load set of records in one table and others set of records to different table in ssis如何将一个表中的记录集和其他记录集加载到ssis中的不同表中
【发布时间】:2019-01-06 22:40:56
【问题描述】:

我在这里有一个基于场景的问题。 假设我有一个表,其中包含几百万条记录,列数很少。我想根据行数将数据加载到 ssis 中的两个不同目的地,前 3 行应该去一个表,第二组三行应该去另一个表这应该重复,直到所有记录都加载到两个目的地。

表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

请告诉我现在的方法

【问题讨论】:

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


    【解决方案1】:

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

    您可以使用类似 OLEDB Source 的 SQL 命令,它会生成一个 Column,根据行号拆分数据。

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

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

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


    方案(二):使用脚本组件+条件拆分

    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 来实现,而无需任何手动实现。

    【讨论】:

    • 其实问题是为了分发数据,但基于记录数
    • @Ram 我尝试使用 SQL 来解决这个问题,但没有成功,所以至少到目前为止你有一个解决方案,希望你能得到一个更好的解决方案。如果我找到了,我会注意到你的。
    • @Ram 我找到了一个使用 SQL 的解决方案,看看我的答案更新。祝你好运
    • 超级感谢@Hadi
    【解决方案2】:

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

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

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

    【讨论】:

    • 我不认为MOD 在这种情况下工作,它不会给出预期的结果。它将在一张表中插入1,2,4,5,7,8 ...,在另一张表中插入3,6,9,12,15 ...
    • 是的,我已经考虑过了,但我不确定是否有其他方法可以在不影响性能的情况下做到这一点。 row_number 可以使用,但我没有在 ssis 上尝试过
    • MOD 可用,但不会给出预期的结果。第一行和第二行将被插入到第一个表中,第三行将被插入到另一个表中,所以一个......
    • MOD(ID,3) = 0 在 SSIS 表达式中写为 ID % 3 == 0。我更新了关于分布式平衡的答案,请看一下
    • @Hadi 我们可以使用一些 SQL 逻辑吗,因为脚本组件是异步的,可能会降低性能
    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多