我目前的工作流程如下:
“执行 SQL 任务”任务运行填充表的存储过程。
此后,“数据流任务”任务执行以下操作:
2A。通过使用 OpenRowset 的“数据流组件”读取该表中的每一行。
2B。将其传递给另一个执行一些转换的数据流组件。
2C。将结果写入 CSV。
从步骤 1 到步骤 2A 的移动似乎是多余的,因为服务器上的表再也没有被使用过。我想让存储过程返回它将写入表的行,并让流程使用这些行而不是读取表。这可能吗?
我目前的工作流程如下:
“执行 SQL 任务”任务运行填充表的存储过程。
此后,“数据流任务”任务执行以下操作:
2A。通过使用 OpenRowset 的“数据流组件”读取该表中的每一行。
2B。将其传递给另一个执行一些转换的数据流组件。
2C。将结果写入 CSV。
从步骤 1 到步骤 2A 的移动似乎是多余的,因为服务器上的表再也没有被使用过。我想让存储过程返回它将写入表的行,并让流程使用这些行而不是读取表。这可能吗?
事实上,我可能把下面的解决方案变得过于复杂了。您不能只将数据流中的数据源设置为
Data access mode = SQL command
并放弃EXEC youProcedure
吗SQL command text
?如果您需要在调用数据流之前向过程使用提供非静态参数Data access mode = SQL command from variable
并在控制流中构造 SQL 字符串(使用表达式任务)?(这是假设 OleDB 连接管理器,其他源可能需要稍作更改)
ResultSet = Full result set
。Result Name = 0
映射到上面创建的变量。运行此步骤后,变量将包含完整的结果集。
在后续的数据流任务中:
using System.Data;
和using System.Data.OleDb;
。CreateNewOutputRows()
方法中,将结果集复制到 DataTable 中,如下所示:foreach (DataRow r in sprocResult.Rows)
,在循环的每次迭代中向输出流添加一行 withOutputRowsBuffer.AddRow()
(更改名称以匹配上面定义的输出)并使用 或 设置OutputRowsBuffer.<columnname> = r["<columnname>"];
值OutputRowsBuffer.<columnname>_IsNull = true;
RejectedRowsBuffer.SetEndOfRowset();
.此技术有一些变体,主要是使用不同的方法与 C# 代码中的 ResultSet 进行交互。
这对于大型数据集来说效率很低(无论是在使用的内存方面,还是在较小程度上,在处理时间方面),因为您正在将静态结果读入对象变量中的 SSIS 内存空间,然后将其复制到 C# 中的 DataTable 对象中。您可以让源脚本直接与数据库交互(将其传递给连接管理器并让它连接并运行过程)——这样数据将从存储过程流式传输到数据流中,而无需完全存储在对象中在RAM之间。