【发布时间】:2010-04-01 11:13:41
【问题描述】:
对于 SSIS 和 ETL 流程来说是相当新的,我想知道是否有循环通过 DataFlowTask 中的记录集并将每一行(从该行派生参数)传递到存储过程(下一步ETL 阶段)。将行传递到存储过程后,我希望将每次迭代的结果写入表。 有谁知道怎么做?
谢谢。
【问题讨论】:
标签: sql ssis data-warehouse etl
对于 SSIS 和 ETL 流程来说是相当新的,我想知道是否有循环通过 DataFlowTask 中的记录集并将每一行(从该行派生参数)传递到存储过程(下一步ETL 阶段)。将行传递到存储过程后,我希望将每次迭代的结果写入表。 有谁知道怎么做?
谢谢。
【问题讨论】:
标签: sql ssis data-warehouse etl
SSIS 数据流中的任何 OLEDB 命令转换(用于执行数据库命令)都会在每个输入行中执行一次 - 我认为这是您想要的行为。更多详情here.
在您的场景中,您需要的最低限度是:
Data Source -> OLEDB Command -> Data Target
请注意,这不会提供出色的性能 - 尝试重构存储过程以一次性操作整个输入集可能会更好(在这种情况下,您将在控制流)。
【讨论】:
以下结构将起作用:
创建一个对象变量。 (recordset_object)
创建一个字符串变量。 (record_string)
在控制流中创建“执行 SQL 命令”。该命令应返回您要循环的记录集。
在“执行 SQL 命令”中,在常规选项卡中设置结果集 = 完整结果集。
在“执行 SQL 命令”中,在结果集选项卡中设置结果名称 = 0 和变量名称 = (recordset_object)。
创建“Foreach 循环容器”并在“执行 SQL 命令”和“Foreach 循环容器”之间创建优先约束。
在“Foreach 循环容器”中,在 Collection 选项卡中设置 Enumerator = Foreach ADO Enumerator。
在“Foreach 循环容器”中,在 Collection 选项卡中设置 ADO 对象源变量 = User::recordset_object。
在“Foreach 循环容器”中,在 Collection 选项卡中设置 Enumeration mode = Rows in the first table。
在“Foreach 循环容器”的“变量映射”选项卡中,设置变量 = User::record_string 和索引 = 0。
在控制流设计图面的“Foreach 循环容器”中,添加“执行 SQL 命令”。
对于子“执行 SQL 命令”,您可以 (13) 将 SQLStatement 设置为使用生成要执行的代码的变量,或 (14) 映射参数,或 (15)使record_string成为代码执行的SQL命令。
如果您使用变量,则它可能类似于 User::sql_code_string,其值可能类似于“EXEC schema.some_stored_procedure '”+@[record_string] +“';”。然后,您将在子“执行 SQL 命令”= 变量的常规选项卡中设置 SQLSourceType,并将 SQLStatement 设置为 User::sql_code_string。
如果使用参数,则在子“执行 SQL 命令”中的 Parameter Mapping 选项卡集变量名称 = User::record_string,方向 = 输入,数据类型 = VARCHAR,参数名称 = 0,参数大小 = -1。在子“执行 SQL 命令”的“常规”选项卡中,将 SQLStatement 设置为“EXEC schema.some_stored_procedure ?”。
与 13 类似,但您可以执行 User::record_string,而不是创建单独的变量。如果您的数据集返回的 record_string 的内容是您要执行的查询,这可能会起作用。
我通常更喜欢这种方法而不是 @Ed 的解决方案,您可以为每条记录添加额外的步骤。例如,我经常在我的控制流中添加其他对象,如脚本任务、数据流和执行 SQL 命令。从我的角度来看,这是一种更灵活、更易于理解的方法,但@Ed 的解决方案绝对符合您的问题标准。
祝你好运,如果您需要说明说明,请告诉我。
【讨论】: