是否可以在SSIS脚本组件源中读取对象变量值?
我有一个Object类型的变量,它包含使用SQL脚本任务填充的表中的记录。
我已经使用过这个脚本任务,它使用下面的代码
完美地工作oleDA.Fill(dt, Dts.Variables("vTableRowsObj").Value)
以这种方式vTableRowsObj
是对象变量。
我想在SSIS脚本组件中读取此对象,以便我可以直接将脚本组件的输出提供给目标表。
最终目标是我计划创建更多的对象变量,只需读取这些对象,就可以从脚本组件中将输出提供给目标表。
答案 0 :(得分:4)
我有类似的问题。
这里有一些引用的链接,我的代码在下面是ID和Name的简单输出。
http://agilebi.com/jwelch/2007/03/22/writing-a-resultset-to-a-flat-file/
http://www.ssistalk.com/2007/04/04/ssis-using-a-script-component-as-a-source/
http://consultingblogs.emc.com/jamiethomson/archive/2006/01/04/SSIS_3A00_-Recordsets-instead-of-raw-files.aspx
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Xml;
using System.Data.OleDb;
public override void CreateNewOutputRows()
{
DataTable dt = new DataTable();
OleDbDataAdapter oleda = new OleDbDataAdapter();
oleda.Fill(dt, this.Variables.ObjectVariable);
foreach (DataRow row in dt.Rows)
{
Output0Buffer.AddRow();
Output0Buffer.ID = Convert.ToInt32(row.ItemArray[0]);
Output0Buffer.Name = row.ItemArray[1].ToString();
}
}
答案 1 :(得分:2)
鉴于您有一个包含SQL脚本任务填充记录的表,为什么需要将该数据加载到Object类型的变量中?为什么不将该表用作数据流中的数据源?基本步骤是......
1)运行SQL Script任务并将结果加载到表中(听起来你已经这样做了)
2)跳过将记录加载到Object变量
3)而是添加数据流组件作为SQL脚本任务的下游连接
4)将Source组件添加到数据流:使用您使用SQL Script Task填充的表作为数据源
5)将Destination组件添加到数据流:使用目标表作为数据目标
然而,本着回答你直接问的问题的精神(如果我事实上理解你的问题),那么简单的答案是肯定的,你可以使用SSIS脚本组件作为数据流中的数据源。 This article walks you through the steps
答案 2 :(得分:2)
由于我今天偶然发现了这个问题,让我给你解决方案:
首先(你已经做过但为了清楚起见而放在这里的东西):
使用" ResultSet"创建ExecuteSQL任务。设置为"完整结果集"并将其分配给对象类型变量:
然后将其链接到"脚本任务"然后将变量添加到" ReadOnly"或" ReadWriteVariables"
现在您只需要访问此变量 - 正如您所建议的那样将其填充到数据表中,然后将其分配给字符串变量:
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Data.OleDb;
public void Main()
{
// TODO: Add your code here
DataTable dt = new DataTable();
var oleDa = new OleDbDataAdapter();
oleDa.Fill(dt, Dts.Variables["Destination"].Value);
string yourValueAsString= dt.Rows[0][0].ToString();
Dts.Variables["MyStringVariable"].Value = yourValueAsString;
[...]
Dts.TaskResult = (int)ScriptResults.Success;
}