关于SSIS变量 - 第二部分:对象





5.00/5 (2投票s)
关注SSIS中独特的对象变量数据类型
我上次的帖子讨论了在行计数转换中使用 SSIS 变量的简单示例,然后使用该变量在约束表达式中控制包的流程。本帖将重点介绍独特的对象变量数据类型。对象数据类型是 .NET 中的终极基类。这具体意味着什么?对象是类型层次结构的根,这意味着一切,归根结底都是对象。MSDN 在此处完整记录了对象数据类型,并在此处提供了示例代码。
对象可以包含的最有趣的几个值之一是完整的结果集,然后可以将其视为集合。有一点我想指出的是,仅仅因为你可以并不意味着你应该。我经常被问到如何在 SSIS 的变量中包含结果集,当我问原因时,我经常被告知它将用于在控制流中对结果进行复杂转换。等等!!这正是数据流任务的用途!!对此,我经常被告知转换在脚本任务中进行最为容易。同样,数据流中有一个脚本组件,它可以充当源、转换和/或目标,并且出于最佳实践和性能考虑,此类复杂转换应保留在数据流中。
如果我还没有让你害怕,让我指出几个其他的性能考虑因素。首先,将变量的范围限制在仅需要的内容,例如任务、容器,以及仅在必要时限制在包。存储对象所需的内存将取决于存储在变量中的值,因此需要格外注意将暴露限制在仅需要的内容上。装箱和拆箱也可能产生性能成本,MSDN 在此处记录了装箱和拆箱。
说了这么多坏消息,让我们来看看对象变量以及如何使用它。为了正确演示,让我们列出示例包的要求。来自 SQL 执行任务的结果集需要被捕获在对象变量中,该变量将包含两列:FirstName
和 LastName
。然后将遍历结果集以执行复杂逻辑,在这种情况下,只是将值传递到脚本任务,该任务将名称显示在消息框中(我知道!!这只是一个简单的例子)。此包需要三个变量
1. Names |
对象 |
2. FirstName |
字符串 |
3. LastName |
字符串 |
创建了变量后,我们现在可以开始使用 SQL 执行任务填充 Names
变量。该任务需要将 Result Set
属性设置为完整结果集,并且 Connection Type
将使用 OLEDB 连接到我的 localhost 默认实例,连接到 Adventureworks2012
数据库。查询足够简单
SELECT FirstName,
LastName
FROM Person.Person
现在我们需要在任务中定义 Result Set
设置,以指定结果将被捕获在我们 Names
对象变量中。在 Result Set
选项卡中,您必须指定要存储在 Name
属性中的结果的零基索引值,因为我们的查询只返回一个结果集,因此将设置为 0
,然后是用于保存结果集的 SSIS 变量的 Variable Name
,在本例中为 Names
。
我们的包现在将使用查询结果填充 Names
变量,现在我们可以通过几种方法来处理此变量。
ForEach 容器
处理对象的第一个方法是使用 Foreach
容器并将 Enumerator
设置为 Foreach
ADO Enumerator
并定义 ADO object source variable 为我们的 Names
变量
请记住,Names
是一个对象,非常像一个数组或集合,所以我们需要同时获取两列 FirstName
和 LastName
,并将它们放入各自的变量中。这在 Variable Mapping 页面上完成,再次将列的序数位置的零基索引值映射到相应的变量
**我故意将 LastName 和 FirstName 的顺序颠倒,以演示变量映射是基于零基索引进行的,而不是基于变量映射到列的顺序进行的
在 ForEach
容器内,放置一个脚本任务,该脚本任务的 ReadWriteVariables
或 Read Only Variables 设置为 FirstName
和 LastName
您可能会问为什么不提供对 Names
变量的访问。答案是 ForEach
容器访问 Names
对象变量并迭代每一行,将 FirstName
列放入 FirstName
变量,将 LastName
列放入 LastName
变量,一次一个地将这些变量传递给脚本任务,因此不需要直接访问对象。
C# 脚本任务只需调用 MessageBox Show
方法逐个显示名称
MessageBox.Show(“The name is: ” + Dts.Variables[0].Value.ToString() +” ” +
Dts.Variables[1].Value.ToString());
脚本任务
处理变量的另一种方法是直接在脚本任务中进行。由于脚本任务现在将直接迭代 Names
对象变量,因此需要将该变量分配给脚本任务的 ReadWriteVariables
或 ReadOnlyVariables
C# 脚本任务首先创建一个 OleDbAdapter
和一个数据表,并调用 OleDbAdapters
的 Fill
方法来使用 Names
对象变量填充数据表。数据表填充后,使用 foreach
循环遍历结果并使用 MessageBox Show
方法显示结果。
//Populate a data table with the Names Variable
OleDbDataAdapter A = new OleDbDataAdapter();
System.Data.DataTable dt = new System.Data.DataTable();
A.Fill(dt, Dts.Variables["User::Names"].Value);
// Iterate through the data table
foreach (DataRow row in dt.Rows)
{
string FirstName;
string LastName;
object[] array = row.ItemArray;
FirstName = array[0].ToString();
LastName = array[1].ToString();
MessageBox.Show(“FirstName=” + FirstName + ” AND LastName=” + LastName);
下面概述的示例包可以此处下载。