作为SSIS和ETL过程的新手,我想知道是否有任何循环通过DataFlowTask中的记录集并将每行(从行中派生参数)传递到存储过程(下一步中的ETL阶段)。一旦我将行传递给存储过程,我希望每次迭代的结果都写入表。 有谁知道怎么做?
感谢。
答案 0 :(得分:2)
SSIS数据流中的任何OLEDB命令转换(用于执行数据库命令)在每个输入行执行一次 - 我认为这是您想要的行为。更多详情here。
在您的方案中,您需要的最低要求是:
Data Source -> OLEDB Command -> Data Target
请注意,这不会带来很好的性能 - 尝试重构存储过程以便一次性对整个输入集进行操作可能会更好(在这种情况下,您可以使用执行SQL任务控制流程。)
答案 1 :(得分:1)
以下结构可行:
创建一个对象变量。 (recordset_object)
创建一个字符串变量。 (record_string)
在控制流程中创建“执行SQL命令”。该命令应返回您要循环的记录集。
在“执行SQL命令”的“常规”选项卡中,设置“结果集=完整”结果集。
在“执行SQL命令”中,在“结果集”选项卡中设置结果名称= 0和变量名称=(记录集对象)。
创建“Foreach循环容器”并在“执行SQL命令”和“Foreach循环容器”之间创建优先约束。
在“Foreach循环容器”中,在“收集”选项卡中设置Enumerator = Foreach ADO Enumerator。
在“Foreach循环容器”中,在“集合”选项卡中设置ADO对象源变量= User :: recordset_object。
在“Foreach循环容器”中,在“收集”选项卡中,在第一个表中设置“枚举”模式=“行”。
在“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] +“';”。然后,您可以在子项“Execute SQL Command”= Variable的General选项卡中设置SQLSourceType,并将SQLStatement设置为User :: sql_code_string。
如果使用参数,则在参数映射中的子项“执行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?”。
与13类似,但您可以执行User :: record_string,而不是创建单独的变量。如果数据集返回的record_string的内容是您要执行的查询,则可以使用此功能。
我通常比@ Ed的解决方案更喜欢这种方法,您可以为每条记录添加额外的步骤。例如,我经常在我的控制流中添加其他对象,如脚本任务,数据流和执行SQL命令。从我的角度来看,这是一种更灵活,易于理解的方法,但@ Ed的解决方案肯定符合您问题的标准。
祝你好运,如果你需要澄清说明,请告诉我。