我对写入平面文件目的地的SSIS包有以下要求:
在我们达到这个要求之前,这一切都很好:
在此最新要求之前,我的方法是填充临时表,获取每个导出批处理的最小和最大记录ID,然后使用循环控制流(RecordSet / MaxNumberOfRecordsPerFile中的记录数)然后使用数据流选择特定记录范围并将其写入每个文件的任务。这方面的缺点是我知道必须有3个不同的数据流任务(每个特定的文件格式一个),每个任务都调用数据库。根据新的要求,我必须再次调用数据库来获取整个记录集,而不仅仅是迭代部分。
我想做的是进行一次调用以获取整个记录集,将其加载到RecordSet目标对象变量中,然后循环遍历,因此我不必进行如此多的数据库调用。但是,我无法弄清楚如何在数据流任务中使用RecordSet对象变量(或任何变量)作为数据源。有没有办法做到这一点?
答案 0 :(得分:2)
获取查询结果的执行SQL任务,将ResultSet属性设置为完整结果集。在“结果集”窗格下,添加对象类型的变量。添加脚本任务并将执行SQL任务连接到它。在脚本任务编辑器中,将ReadWriteVariables设置为SQL Task的对象变量。在脚本中,您可以从对象变量访问数据:
Dim oleDA As New OleDbDataAdapter
Dim dt As New DataTable
Dim col As DataColumn
Dim row As DataRow
Dim sMsg As String
oleDA.Fill(dt, Dts.Variables("dsObjVar").Value)
For Each row In dt.Rows
For Each col In dt.Columns
sMsg = sMsg & col.ColumnName & ": " & _
row(col.Ordinal).ToString & vbCrLf
Next
MsgBox(sMsg)
sMsg = ""
Next
Dts.TaskResult = Dts.Results.Success
和dt
可以作为常规DataTable处理。