- sql/
- Sql ETL中DataflowTask内的循环控制
Sql ETL中DataflowTask内的循环控制
Sql ETL中DataflowTask内的循环控制,sql,ssis,data-warehouse,etl,Sql,Ssis,Data Warehouse,Etl,由于对SSIS和ETL流程还比较陌生,我想知道是否有必要在DataFlowTask中循环一个记录集,并将每一行(从该行派生参数)传递到一个存储过程(ETL阶段的下一步)。将行传递到存储过程后,我希望将每次迭代的结果写入表中。
有人知道怎么做吗
谢谢。SSIS数据流中的任何OLEDB命令转换(用于执行数据库命令)都会在每个输入行执行一次,我认为这是您想要的行为。更多细节
在您的场景中,您至少需要:
Data Source -> OLEDB Command -> Data Target
由于对SSIS和ETL流程还比较陌生,我想知道是否有必要在DataFlowTask中循环一个记录集,并将每一行(从该行派生参数)传递到一个存储过程(ETL阶段的下一步)。将行传递到存储过程后,我希望将每次迭代的结果写入表中。
有人知道怎么做吗
谢谢。SSIS数据流中的任何OLEDB命令转换(用于执行数据库命令)都会在每个输入行执行一次,我认为这是您想要的行为。更多细节
在您的场景中,您至少需要:
Data Source -> OLEDB Command -> Data Target
请注意,这不会提供很好的性能-最好尝试重构存储过程,以便一次性对整个输入集进行操作(在这种情况下,您将在控制流中使用Execute SQL任务)。任何OLEDB命令转换(用于执行数据库命令)在SSIS中,每个输入行执行一次数据流-我认为这是您想要的行为。更多细节
在您的场景中,您至少需要:
Data Source -> OLEDB Command -> Data Target
请注意,这不会提供很好的性能-最好尝试重构存储过程,以便一次性对整个输入集进行操作(在这种情况下,您将在控制流中使用Execute SQL任务)。以下结构可以工作:
创建一个对象变量。(记录集\对象)
创建一个字符串变量。(记录字符串)
在控制流中创建“执行SQL命令”。该命令应返回要循环的记录集
在“执行SQL命令”的“常规”选项卡中,设置结果集=完整结果集
在“执行SQL命令”中,在“结果集”选项卡中设置结果名=0和变量名=(记录集\对象)
创建一个“Foreach循环容器”,并在“executesql命令”和“Foreach循环容器”之间创建一个优先约束
在“Foreach循环容器”的“集合”选项卡中,设置Enumerator=Foreach ADO Enumerator
在“Foreach循环容器”的“集合”选项卡中,设置ADO对象源变量=User::recordset_object
在“Foreach循环容器”的“集合”选项卡中,设置枚举模式=第一个表中的行
在“Foreach循环容器”中,在变量映射选项卡中设置变量=User::record_字符串,索引=0
在控制流的设计图面中的“Foreach循环容器”中,添加一个“executesql命令”
对于子“Execute SQL Command”,您可以(13)将SQLStatement设置为使用生成要执行的代码的变量,或者(14)在参数中映射,或者(15)使记录字符串成为代码执行的SQL命令
如果使用变量,则它可能类似于User::sql_code_string,其值可能类似于“EXEC schema.some_storage_procedure”'+@[record_string]+“;”。然后在子变量“Execute SQL Command”=的常规选项卡中设置SQLSourceType,并将SQLStatement设置为User::SQL\u code\u string
如果使用参数,则在参数映射的子级“执行SQL命令”中
选项卡集变量名称=用户::记录字符串,方向=输入,数据类型=VARCHAR,参数名称=0,参数大小=-1。在子级“执行SQL命令”的“常规”选项卡中,将SQLStatement设置为“EXEC schema.some_storage_procedure?”
与13类似,但您可以执行User::record\u string,而不是创建单独的变量。如果数据集返回的record_字符串的内容是您要执行的查询,则这可能会起作用
与@Ed的解决方案相比,我通常更喜欢这种方法。您可以为每个记录包含额外的步骤。例如,我经常在控制流中添加其他对象,如脚本任务、数据流和执行SQL命令。从我的角度来看,这是一种更灵活、更容易理解的方法,但@Ed的解决方案完全符合您问题的标准
祝您好运,如果您需要说明,请告诉我。以下结构可以工作:
创建一个对象变量。(记录集\对象)
创建一个字符串变量。(记录字符串)
在控制流中创建“执行SQL命令”。该命令应返回要循环的记录集
在“执行SQL命令”的“常规”选项卡中,设置结果集=完整结果集
在“执行SQL命令”中,在“结果集”选项卡中设置结果名=0和变量名=(记录集\对象)
创建一个“Foreach循环容器”,并在“executesql命令”和“Foreach循环容器”之间创建一个优先约束
在“Foreach循环容器”的“集合”选项卡中,设置Enumerator=Foreach ADO Enumerator
在“Foreach循环容器”的“集合”选项卡中,设置ADO对象源变量=User::recordset_object
在“Foreach循环容器”的“集合”选项卡中,设置枚举模式=第一个表中的行
在“Foreach循环容器”中,在变量映射选项卡中设置变量=User::record_字符串,索引=0
在控制流的设计图面中的“Foreach循环容器”中,添加一个“executesql命令”
对于子“Execute SQL Command”,您可以(13)将SQLStatement设置为使用生成要执行的代码的变量,或者(14)在参数中映射,或者(15)使记录字符串成为代码执行的SQL命令
如果您使用var