如何从记录集对象写入平面文件目标?

时间:2014-06-24 16:41:23

标签: sql-server ssis

我对写入平面文件目的地的SSIS包有以下要求:

  • 接受将决定文件格式的参数(CSV,TSV,固定宽度)
  • 接受一个参数,确定每个文件的最大记录数,例如,如果我返回100000条记录,每个文件的最大记录数为25000,我需要创建4个文件。

在我们达到这个要求之前,这一切都很好:

  • 在实际写入任何文件之前,请为找到的每条记录调用Web服务,并传入recordId和特定消息。

在此最新要求之前,我的方法是填充临时表,获取每个导出批处理的最小和最大记录ID,然后使用循环控制流(RecordSet / MaxNumberOfRecordsPerFile中的记录数)然后使用数据流选择特定记录范围并将其写入每个文件的任务。这方面的缺点是我知道必须有3个不同的数据流任务(每个特定的文件格式一个),每个任务都调用数据库。根据新的要求,我必须再次调用数据库来获取整个记录集,而不仅仅是迭代部分。

我想做的是进行一次调用以获取整个记录集,将其加载到RecordSet目标对象变量中,然后循环遍历,因此我不必进行如此多的数据库调用。但是,我无法弄清楚如何在数据流任务中使用RecordSet对象变量(或任何变量)作为数据源。有没有办法做到这一点?

1 个答案:

答案 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处理。