SSIS 脚本任务:从 datatable1 选择到 datatable2

Posted

技术标签:

【中文标题】SSIS 脚本任务:从 datatable1 选择到 datatable2【英文标题】:SSIS Script Task: Select from datatable1 into datatable2 【发布时间】:2019-05-14 08:24:02 【问题描述】:

我正在使用 SQL 2014、Visual Studio 2013。我有以下代码,这是一个更大的脚本任务的一部分:

//Load DataTable1 with Source Excel Sheet Data
OleDbCommand oconn = new OleDbCommand("select * from [" + sheetname + "]", cnn);
OleDbDataAdapter adp = new OleDbDataAdapter(oconn);
DataTable dt = new DataTable();
adp.Fill(dt);

接下来我想做的是从 datatable1 中选择目标数量的列,然后填充另一个数据表。像这样的:

//Load another DataTable with Data from datatable1
OleDbCommand oconn2 = new OleDbCommand("select [column1], [column2] from datatable1", cnn);
OleDbDataAdapter adp2 = new OleDbDataAdapter(oconn2);
DataTable dt2 = new DataTable();
adp2.Fill(dt2);

这可能吗?这背后的原因很复杂,但我不知道另一种解决方法。我的源文件是 Excel。因此需要将数据放入数据表中。然后需要修改列名。然后可以使用修改后的列名制作一个表。但首先,需要将数据按原样放入数据表中,因为我不确定是否要修改源文件。

谢谢。

【问题讨论】:

为什么需要修改列名?你到底想达到什么目的? @shree:这些源文件是来自取证应用程序的工件,并且列名 - 主要是日期 - 在名称中具有时间戳(即“UTC”、“PST”)。在其他情况下,列名中存在无关字符。我想在 SQL 中创建表之前删除它并规范化这些列名。最终结果是我有运行这些表的存储过程,并且规范化列名是必不可少的。 时间戳是指列名,例如“13-12-2018 00:00:00UTC”,即列名每次都更改?此外,您是即时创建数据库表,还是已经存在这些表? 是的,名称类似于:“文件系统上次修改日期/时间 - UTC+00:00 (M/d/yyyy)”。下一个文件可能是“文件系统上次修改日期/时间 - PST-08:00 (M/d/yyyy)”。我想要一个显示为:“文件系统上次修改日期/时间”的字段。数据库已经存在,它是需要动态创建的表。一旦创建了表,并将字段设置为我想要的(规范化),那么任何后续数据都可以轻松排列和插入。 您为什么不使用内置工具从您的 excel 文件中导入数据,然后将数据映射到您的目的地?除此之外,为什么不拆分您的脚本任务,以便它填充一个 ADO.NET 表,您可以在数据流任务中使用该表插入到您的目标中。然后你的脚本任务的其余部分可以在 DFT 之后运行。 【参考方案1】:

使用将添加到其中的列的数据类型和新名称定义第二个DataTable。然后,您可以使用初始DataTable 中列的序号位置和Add 方法填充此对象,如下所示。

            DataTable dt2 = new DataTable();
            dt2.Columns.Add("NewColumnName1", typeof(int));
            dt2.Columns.Add("NewColumnName2", typeof(string));

            //in this example dt is the original DataTable
            foreach (DataRow dr in dt.Rows)
            
                          //add only necessary columns by their
                          //ordinal position in source DataTable
                         dt2.Rows.Add(dr[1], dr[0]);
            

【讨论】:

以上是关于SSIS 脚本任务:从 datatable1 选择到 datatable2的主要内容,如果未能解决你的问题,请参考以下文章

从 SQL 代理运行时 SSIS 脚本任务失败

无法使用脚本任务从 SSIS 发送邮件 - 超时

SSIS 脚本任务 C# 编码以动态选择具有特定名称的最新 Excel 文件的第一张表

使用 SSIS 脚本任务将数据从多个 SQL 表导出到不同的平面文件

SSIS - 2.使用脚本任务弹出对话框

使用 SSIS 脚本任务刷新 Excel