我正在创建一个SSIS应用程序,该应用程序将动态SQL结果(读取:变量数和列名(写入名为User::ResultSet
的ComObject变量。
我现在想要创建一个 SSIS 任务,该任务删除表testTable
如果存在,然后读取 ComObject 变量并将其插入到 MSSQL Server 中的testTable
表中。所以从本质上讲,我想这样做:
DROP TABLE IF EXISTS dbo.testTable;
SELECT *
INTO dbo.testTable
FROM [User::ResultSet]
在 SSIS 2015 中,在不知道 ComObject 中的类型、名称和列数的情况下,是否可以执行此操作?
好吧,没有脚本对象的普通 SSIS 无法做到这一点。SSIS 以元数据为中心,它必须在包运行之前知道列名和类型。SSIS 运行时环境不允许动态更改元数据定义。
但是,您可以在脚本任务中执行所需的操作。方法是:
-
具有完整结果集的 ComObject 使用的对象类型变量为
ADO Recordset
(如果使用 OLEDB 连接管理器(或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);
-
然后,用值和元数据填充数据表对象,您可以创建 SQL
Create Table
语句,然后 - 从数据表批量插入数据。这是一个出色的代码示例。
脚本任务将基于数据表中的元数据创建 SQL 表,然后将其内容复制到新创建的表中。