ETL中DataflowTask中的循环控制

时间:2010-04-01 11:13:41

标签: sql ssis data-warehouse etl

作为SSIS和ETL过程的新手,我想知道是否有任何循环通过DataFlowTask中的记录集并将每行(从行中派生参数)传递到存储过程(下一步中的ETL阶段)。一旦我将行传递给存储过程,我希望每次迭代的结果都写入表。 有谁知道怎么做?

感谢。

2 个答案:

答案 0 :(得分:2)

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

在您的方案中,您需要的最低要求是:

Data Source -> OLEDB Command -> Data Target

请注意,这不会带来很好的性能 - 尝试重构存储过程以便一次性对整个输入集进行操作可能会更好(在这种情况下,您可以使用执行SQL任务控制流程。)

答案 1 :(得分:1)

以下结构可行:

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

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

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

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

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

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

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

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

  9. 在“Foreach循环容器”中,在“收集”选项卡中,在第一个表中设置“枚举”模式=“行”。

  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] +“';”。然后,您可以在子项“Execute SQL Command”= Variable的General选项卡中设置SQLSourceType,并将SQLStatement设置为User :: sql_code_string。

  14. 如果使用参数,则在参数映射中的子项“执行SQL命令”中 tab set Variable Name = User :: record_string,Direction = Input,Data Type = VARCHAR,Parameter Name = 0,Parameter Size = -1。在子项“执行SQL命令”的“常规”选项卡中,将SQLStatement设置为“EXEC schema.some_stored_procedure?”。

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

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

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