在建立DTS包时,可以选择不同的任务处理数据。其中转换数据任务是最常用的一个任务。它的功能主要是将一个数据源中的数据复制到另外一个数据源中(在这个过程中可能会对源数据进行一系列的处理)。
在包设计器中选择转换数据任务,系统会要求您选择源连接和目的连接。在选择完这两个连接后,系统会在这两个连接之间建立一个单向的箭头,箭头指向目的连接。现在一个默认的转换数据任务已经建立完成,但这个默认的任务一般不会满足使用者的要求,因此可以通过任务的弹出菜单的“属性”菜单项设置这个任务。属性对话框如图1所示
图1 属性对话框
从上图可以看出,可以从5个方面设置转换数据任务的属性。
1. 源。
这个属性非常简单,主要是选择想要导出源连接中的哪个表或视图(本文选择pubs数据库中的authors表)。它提供了两种方式,一种是直接选择表名或视图名;另外一种则是通过SQL语句对表或视图进行查询,这种方式可以更灵活地选择表或视图中的行和列。除了可以手工输入SQL语句外,也可以通过点击“生成查询”按钮启动“数据转换服务查询设计器”可视化地生成SQL。
2. 目的。
这个属性页和源的属性页差不多。需要选择要导出到目标数据库中的哪个表。但和源的属性页不同的是导出表可以是不存在的表。点击“创建”按钮,会根据在源的属性页中选择的表或视图生成相应的建立相同结构的表的SQL语句,如果使用的是SELECT查询,所生成的CREATE TABLE将按SELECT 所查的字段生成。下面是根据authors表产生的建表的SQL语句。
CREATE TABLE [authors] (
[au_id] varchar (11) NOT NULL,
[au_lname] varchar (40) NOT NULL,
[au_fname] varchar (20) NOT NULL,
[phone] char (12) NOT NULL,
[address] varchar (40) NULL,
[city] varchar (20) NULL,
[state] char (2) NULL,
[zip] char (5) NULL,
[contract] bit NOT NULL )
3. 转换。
一般前两个属性是必须设置的。但到了转换属性页,系统默认地为源表和目标表生成了一种转换模式,即字段一一对应的模式(1对1模式)。这种模式默认是根据字段名来确定对应关系,即在源表中的字段对应于目标表中相同名子的字段。在对于源字段和目标字段相同的情况下,可以采用另外一种对应关系:N对N模式。要想设置这种方式,首先删除当前的对应关系,点击“新建”按钮建立一个“Copy Column”转换,在转换选项中将源列和目的列的字段都设为“选中的列”,点“确定”保存即可。如果在字段相同的情况下,采用N对N模式要比较1对1模式的效率更高,因为N对N模式只进行一次数据抽取(有几条连接源字段和目的字段的线,一般就进行几次数据抽取),而1对1模式需要进行N次数据抽取。N对N模式如图2所示。

图2
除了采用上述两种模式外,还可以采用不等字段的对应方式,即一个或多个源字段对应多个或一个目标字段的模式。这种模式应用得非常的多,如将源表中的年、月、日字段合并为目标表中的日期字段,或者是将源表中的日期字段拆成目标表中的年、月、日字段。如果想进行更灵活的转换,可以通过ActiveX Script编写转换代码,如将源表中的单价和销售数量字段转换为目标表中的销售额字段,可以使用如下的VBScript来编写。
Function Main()
DTSDestination("sale") = DTSSource("quantity") * DTSSource("price")
Main = DTSTransformStat_OK
END Function
在进行更为复杂的转换时,可以同时采用上述的三种模式,即混合模式。
在上述的转换中只采用了“Copy Column”和“ActiveX Script”转换,为了增强DTS的可用性,Microsoft除了提供“Copy Column”和“ActiveX Script”外,又为我们提供了7种转换方式。
(1) “DateTime String”转换
可以将源字段中的一种日期格式转换为另外一种日期格式,再复制到目标字段中。如将dd MMMM yy HHmmss.ff格式转换为dddd MM/dd/yy hh:mm tt格式。在使用这种模式进行转换时,源字段和目标字段可以是字符串或日期类型。当某一个字段是日期类型时,为它所指定的日期格式将被忽略。
(2) “Lowercase String”和“Uppercase String”转换
顾名思义,这两种转换是将源字段中的所有英文字母转换为小写或大写字母的转换。在使用这两种转换时必须注意,源字段和目标字段必须是字符串类型。
(3) “Trim String”转换
这种转换能剪裁源字段中的字符串的首尾以及中间的空格,并且包含了“Lowercase String”和“Uppercase String”转换的功能。
(4) “Middle of String”转换
这种转换将源字段中的字符串截取后保存在相应的目标字段中。并且包含了“Trim String”转换的功能。
(5) “Read File”转换
这种转换根据源字段中所指定的文件名,将文件中的内容复制到目标字段中。注意,在源字段中只需要存放文件名即可。
(6) “Write File”转换
这种转换将源字段中的内容写到一个文件中。它只有两个源字段,没有目标字段。这两个源字段一个存放文件内容,一个存放文件名。
4 查找
“查找查询”是“转换数据任务”的核心功能之一。在上述的转换功能中,已经足可以进行一般的转换任务了,但是有一些情况还很难做到。如我们要将源表中的“城市名称”复制到目标表的相应字段,但是源表中只有“区号”,而“区号”和“城市名称”的对应关系保存在了另外一张表中,如果按平常的做法,可以用视图将两个表连接起来,但这样就得另建一个物理对象,如果这种转换很多的话,就会带来非常的不便。因此,在“查找查询”中提供了另外一种解决方案,即可以在ActiveX Script中执行SQL语句。
通过新建一个查询,在转换的过程中可以在其它的连接中查询数据,然后将这些数据进行处理后复制到目标表中。可能通过“数据转换服务查询设计器”来输入用于查询的SQL。这个SQL可以使用“?”做为参数。查询“区号”所对应的“城市名称”的SQL语句为:
SELECT 城市名称 FROM 编码转换表 WHERE (区号 = ?)
然后在ActiveX Script中就可以根据“区号”直接将“城市名称”复制到目标表中了。
Function Main()
DTSDestination("城市名称") = DTSLookups("查询相应的城市名称").Execute(DTSSource("区号"))
Main = DTSTransformStat_OK
End Function
其中“"查询相应的城市名称”是这个查询的名子。
使用DTSLookups还可以将多个值保存在数组中。如同时查询国家代码和城市区号。
SELECT 国家名称, 城市名称 FROM 编码转换表 WHERE (国家代码 = ?) AND (区号 = ?)
ActiveX Script为:
Function Main()
Dim myarray
myarray = DTSLookups("得到国家和城市名称").Execute(DTSSource("国家代码"), DTSSource("区号"))
DTSDestination("国家名称") = myarray(0)
DTSDestination("城市名称") = myarray(1)
Main = DTSTransformStat_OK
End Function
“查找查询”不仅可以根据使用SELECT, 而且也可以使用INSERT、UPDATE、DELETE语句。
UPDATE 工资 SET 基本工资 = 基本工资 * 1.1 WHERE 员工编号 = ?
然后可以在ActiveX Script中执行这条SQL语句
DTSLookups("给员工加薪").Execute(DTSSource("员工编号"))
“查找查询”还有很多其它的功能,如果读者想知道更详细的内容,可查询相关文档。
注:虽然“查找查询”的连接可以和源连接共享,但建议为“查找查询”单独建立一个或多个连接,以提高数据转换的效率。
5. 选项。
这是最后一个属性页。可以在其中设置一些辅助数据转换的信息。如文本文件行的分隔符,是否保留NULL值等,读者可以根据需要进行设置。
总结
本文详细讨论了“转换数据任务”的主要的功能。“转换数据任务”是DTS最主要的任务,它使用得非常广泛。尤其值得称道的是它提供了ActiveX Script支持,并且可以在ActiveX Script中执行SQL语句,这将给数据转换带来非常大的灵活性。
01.JPG
02.JPG
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29262361/viewspace-2131279/
,如需转载,请注明出处,否则将追究法律责任。