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的主要内容,如果未能解决你的问题,请参考以下文章
SSIS 脚本任务 C# 编码以动态选择具有特定名称的最新 Excel 文件的第一张表