我正在创建一个SSIS应用程序,该应用程序将动态SQL结果(读取:变量号和列名)写入名为User::ResultSet
的ComObject变量。
我现在想创建一个SSIS任务,如果表testTable
存在,则将其删除,然后读取ComObject变量并将其插入MSSQL Server中的testTable
表中。所以从本质上讲,我想这样做:
DROP TABLE IF EXISTS dbo.testTable;
SELECT *
INTO dbo.testTable
FROM [User::ResultSet]
在不知道ComObject的类型,名称和列数的情况下,在SSIS 2015中是否可能?
答案 0 :(得分:3)
那么,没有脚本对象的普通SSIS无法做到这一点。 SSIS以元数据为中心,必须在运行包之前知道列名和类型。 SSIS运行时环境不允许即时更改元数据定义。
但是,您可以在脚本任务中执行所需的操作。这是方法:
对象类型具有完整结果集的ComObject使用的变量是ADO Recordset
(如果使用OLEDB Connection Manager)或ADO DataSet
(如果使用ADO.NET CM)。在前一种情况下,用类似的代码将ADO Recordset
转换为ADO DataTable
。
using System.Data.OleDb;
public void Main()
{
DataTable dt = new DataTable();
OleDbDataAdapter oleda = new OleDbDataAdapter();
oleda.Fill(dt, this.Variables.ObjectVariable);
然后,使用填充了值和元数据的DataTable对象,您可以创建SQL Create Table
语句,然后-从DataTable中批量插入数据。这是excellent code example。
您的脚本任务将基于DataTable中的元数据创建SQL表,然后将其内容复制到新创建的表中。