Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ETL中DataflowTask内的循环控制_Sql_Ssis_Data Warehouse_Etl - Fatal编程技术网

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