【问题标题】:Loop Control within a DataflowTask in ETLETL 中 DataflowTask 中的循环控制
【发布时间】:2010-04-01 11:13:41
【问题描述】:

对于 SSIS 和 ETL 流程来说是相当新的,我想知道是否有循环通过 DataFlowTask 中的记录集并将每一行(从该行派生参数)传递到存储过程(下一步ETL 阶段)。将行传递到存储过程后,我希望将每次迭代的结果写入表。 有谁知道怎么做?

谢谢。

【问题讨论】:

    标签: sql ssis data-warehouse etl


    【解决方案1】:

    SSIS 数据流中的任何 OLEDB 命令转换(用于执行数据库命令)都会在每个输入行中执行一次 - 我认为这是您想要的行为。更多详情here.

    在您的场景中,您需要的最低限度是:

    Data Source -> OLEDB Command -> Data Target
    

    请注意,这不会提供出色的性能 - 尝试重构存储过程以一次性操作整个输入集可能会更好(在这种情况下,您将在控制流)。

    【讨论】:

      【解决方案2】:

      以下结构将起作用:

      1. 创建一个对象变量。 (recordset_object)

      2. 创建一个字符串变量。 (record_string)

      3. 在控制流中创建“执行 SQL 命令”。该命令应返回您要循环的记录集。

      4. 在“执行 SQL 命令”中,在常规选项卡中设置结果集 = 完整结果集。

      5. 在“执行 SQL 命令”中,在结果集选项卡中设置结果名称 = 0 和变量名称 = (recordset_object)。

      6. 创建“Foreach 循环容器”并在“执行 SQL 命令”和“Foreach 循环容器”之间创建优先约束。

      7. 在“Foreach 循环容器”中,在 Collection 选项卡中设置 Enumerator = Foreach ADO Enumerator。

      8. 在“Foreach 循环容器”中,在 Collection 选项卡中设置 ADO 对象源变量 = User::recordset_object。

      9. 在“Foreach 循环容器”中,在 Collection 选项卡中设置 Enumeration mode = Rows in the first table。

      10. 在“Foreach 循环容器”的“变量映射”选项卡中,设置变量 = User::record_string 和索引 = 0。

      11. 在控制流设计图面的“Foreach 循环容器”中,添加“执行 SQL 命令”。

      12. 对于子“执行 SQL 命令”,您可以 (13) 将 SQLStatement 设置为使用生成要执行的代码的变量,或 (14) 映射参数,或 (15)使record_string成为代码执行的SQL命令。

      13. 如果您使用变量,则它可能类似于 User::sql_code_string,其值可能类似于“EXEC schema.some_stored_procedure '”+@[record_string] +“';”。然后,您将在子“执行 SQL 命令”= 变量的常规选项卡中设置 SQLSourceType,并将 SQLStatement 设置为 User::sql_code_string。

      14. 如果使用参数,则在子“执行 SQL 命令”中的 Parameter Mapping 选项卡集变量名称 = User::record_string,方向 = 输入,数据类型 = VARCHAR,参数名称 = 0,参数大小 = -1。在子“执行 SQL 命令”的“常规”选项卡中,将 SQLStatement 设置为“EXEC schema.some_stored_procedure ?”。

      15. 与 13 类似,但您可以执行 User::record_string,而不是创建单独的变量。如果您的数据集返回的 record_string 的内容是您要执行的查询,这可能会起作用。

      我通常更喜欢这种方法而不是 @Ed 的解决方案,您可以为每条记录添加额外的步骤。例如,我经常在我的控制流中添加其他对象,如脚本任务、数据流和执行 SQL 命令。从我的角度来看,这是一种更灵活、更易于理解的方法,但@Ed 的解决方案绝对符合您的问题标准。

      祝你好运,如果您需要说明说明,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-08
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        相关资源
        最近更新 更多