在SSIS中自定义VB.Net脚本(下)

日期: 2009-07-12 作者:Robert Sheldon翻译:曾少宁 来源:TechTarget中国 英文

添加Visual Basic.Net代码   现在我们可以添加实际的代码到Script组件上了。打开Script Transformation编辑器的Script页面,点击“Design Script”。 “Microsoft Visual Studio for Applications”窗口会出现,并且还包含了我们需要使用的初始Visual Basic.Net代码,如图4所示。   图4:带有VB.Net代码的“Visual Studio for Applications”窗口。

  代码开头是几个关于Script组件的注释。注释都是跟在一个单引号后面。我们可以删除这些注释然后添加其它注释上……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

添加Visual Basic.Net代码

  现在我们可以添加实际的代码到Script组件上了。打开Script Transformation编辑器的Script页面,点击“Design Script”。 “Microsoft Visual Studio for Applications”窗口会出现,并且还包含了我们需要使用的初始Visual Basic.Net代码,如图4所示。

  图4:带有VB.Net代码的“Visual Studio for Applications”窗口。

  代码开头是几个关于Script组件的注释。注释都是跟在一个单引号后面。我们可以删除这些注释然后添加其它注释上去。注意,此处生成的Visual Basic代码仅限于Script Transformation组件的。当作为源或者目标时,组件生成的代码是不同的。

  自动生成的代码以一系列的Imports语句开始来定义我们可能要在脚本中使用的初始命名空间。我们可以根据需要添加更多的命名空间。ScriptMain类跟在Imports语句之后,然后是类中的Input0_ProcessInputRow()方法。我们必须以这个类和方法开始,然后再添加我们的自定义代码到方法中,此处的注释说明:“在此处添加你的代码”。

  正如我们所看到的,SSIS让一切变得简单多了。只需要在指定的地方上输入我们的代码。对于本文中所探讨的方法,我首先定义了一组变量,然后将变量合并在一起来创建用户名。你可以点击此处下载所有Visual Basic.Net代码。

  首先,我创建名字、中间名和姓变量,它们分别是First、Middle和Last。在第一行中,我声明了First变量类型为字符串,接着,在第二行中,我给它赋值为名字的第一个字母:

  Dim First As String
  First = LCase(Row.FirstName.Substring(0, 1))

  注意,我使用了Row变量——它是在Input0_ProcessInputRow()方法中定义的——来从输入中取回FirstName字段。当我取到这个名字时,我使用了Substring()方法来只截取结果的第一个字母。接着,我将结果传递给LCase()方法,将字母全部转换为小写。

  对于Middle变量,我执行类似地操作,但是我首先检查了MiddleName值是否是一个NULL值:

  Dim Middle As String
  If Row.MiddleName_IsNull Then
  Middle = ""
  Else
  Middle = LCase(Row.MiddleName.Substring(0, 1))
  End If

  这里我使用一个If-Else-End If结构来判断值是否为NULL。如果它是一个NULL,那么我将Middle值设置为空的字符串。否则,我会跟处理名字一样取回第一个字母。

  对于Last变量,我希望从LastName字段中选取前面4个字母。然而,我需要检查名称包含的字母是否少于4个,以及是否包含一个单引号:

  Dim Last As String
  If Row.LastName.Length < 5 Then
  If Row.LastName.Contains("'") Then
  Last = LCase(Row.LastName.Replace("'", ""))
  Else
  Last = LCase(Row.LastName)
  End If
  Else
  If Row.LastName.Contains("'") Then
  Last = LCase(Row.LastName.Replace("'", "").Substring(0, 4))
  Else
  Last = LCase(Row.LastName.Substring(0, 4))
  End If
  End If

  首先,我在最外部使用一个If-Else-End If条件来判断名字中包含的字母是否少于5个。如果是,那么我使用整个姓的部分。如果不是,那么我只使用它前面4个字母。

  为了处理好名字可能包含一个单引号的情况,我在外部的If-Else-End If条件内再嵌入一个If 和Else语句。如果名字中包含一个单引号,那么我会用一个空的字符串替代它。否则,我会使用名字本身。

  最后,我将声明和赋值YearHired变量,它从HireDate字段中获取年份:

  Dim YearHired As String
  YearHired = CStr(Row.HireDate.Year).Substring(2, 2)

  注意,我首先使用Row变量来检索HireDate字段中的Year属性。接着,我使用CStr()方法来将日期转换为字符串,然后使用Substring()方法来检索年的最后两个数字。

  在我定义了这些变量之后,我通过组合这些变量来创建用户名:

  If Row.HireDate < CDate("2000-01-01") Then
  Row.UserName = First + Last + YearHired
  Else
  Row.UserName = First + Middle + Last + YearHired
  End If

  再次,我使用了If-Else-End If条件来确定使用哪个逻辑。对于2000年之前所雇用的员工,我根据名字的首字母、姓的前4个字母和雇用年份的最后两位数字来创建一个用户名。对于其他人,我还将中间名的首字母包括在内,除此之外其它都使用了相同的逻辑。我将用户名称赋值到UserName字段上,这样,它就可以与其它的字段一样通过Row变量来读取了。

  这就是添加一个Script组件到数据流上所需要的操作。在我们添加了代码之后,就可以关闭Visual Studio for Applications窗口以及Script Transformation编辑器。这样,我们就可以添加我们的目标组件了。

  配置Flat File Destination组件

  在我们添加了Flat File Destination组件之后,就连接从Script组件到目标的数据流路径,同时打开Flat File目标编辑器。现在添加一个指向文本文件的Flat File连接管理器。对于这个例子,我使用c:employees.txt,并将原来的4个字段和一个新的UserName字段映射到目标上。这里所有项我都使用了默认的设置。在我们完成了之后,关闭所有打开的编辑器并保存SSIS包。现在运行包。员工的信息——以及新的用户名——将被添加到文本文件中。

  当然,此处我所探讨的方法只是一个非常基本的例子。然而,它确实可以演示添加自定义代码到SSIS需要的所有组件。你也可以尝试创建其它类型的脚本和添加脚本源和目标。而且你会发现,Script组件能够访问大量的Visual Basic.Net开发环境,并且还允许你扩展SSIS包来实现所需要的任何数据提取、转换和加载(ETL)。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐