SQL SERVER 2008 SSIS 基础文档_第1页
SQL SERVER 2008 SSIS 基础文档_第2页
SQL SERVER 2008 SSIS 基础文档_第3页
SQL SERVER 2008 SSIS 基础文档_第4页
SQL SERVER 2008 SSIS 基础文档_第5页
已阅读5页,还剩183页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SSIS 使用手册 -天善智能 QQ:744711023天善智能微软BI培训正式起航,天善团队将于3月10日下午1点进行SSIS(ETL)讲解。3月10日下午1点不见不散!详情:/weiruanSQL SERVER 2008 SSIS 基础文档1 时间戳一直对时间戳这个概念比较模糊,相信有很多朋友也都会误认为:时间戳是一个时间字段,每次增加数据时,填入当前的时间值。其实这误导了很多朋友。1.1 基本概念 时间戳数据库中自动生成的唯一二进制数字,与时间和日期无关的, 通常用作给表行加版本戳的机制。存储大小为 8个字节。每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加。该计数器是数据库时间戳。这可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。一个表只能有一个 timestamp 列。每次修改或插入包含 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。这一属性使 timestamp 列不适合作为键使用,尤其是不能作为主键使用。对行的任何更新都会更改 timestamp 值,从而更改键值。如果该列属于主键,那么旧的键值将无效,进而引用该旧值的外键也将不再有效。如果该表在动态游标中引用,则所有更新均会更改游标中行的位置。如果该列属于索引键,则对数据行的所有更新还将导致索引更新。使用某一行中的 timestamp 列可以很容易地确定该行中的任何值自上次读取以后是否发生了更改。如果对行进行了更改,就会更新该时间戳值。如果没有对行进行更改,则该时间戳值将与以前读取该行时的时间戳值一致。若要返回数据库的当前时间戳值,请使用 DBTS。1.2 时间戳的作用在控制并发时起到作用: 用户A/B同时打开某条记录开始编辑,保存是可以判断时间戳,因为记录每次被更新时,系统都会自动维护时间戳,所以如果保存时发现取出来的时间戳与数据库中的时间戳不相等,说明在这个过程中记录被更新过,这样的话可以防止别人的更新被覆盖。1.3 时间戳的应用简单说一下,timestamp 主要是记录该行的最后修改时间戳,注意,这个时间戳是不可以转换为时间的,只能标注该行修改了。有什么用呢?通常是用在数据增量更新方面,比如说,我从该表复制数据到另外一个表,但是如果我想只复制更新过的,那么从最后一次更新的时候,记录最大的timestamp的值,然后在当前更新的时候,只要where条件找出大于最后一次更新的 timestamp 值的所有行。然后抽取到更新过的数据,进行复制到另外一个服务器,这就是增量更新用到的。1.4 在SQL中的应用例子 (微软的建议 - timestamp 语法已被取代,在 DDL 语句,请尽量使用 rowversion 而不是 timestamp。未来的 Microsoft SQL Server 版本将移除这项功能。参见/zh-cn/library/ms182776.aspx) RowsVersion就是timestamp丢失更新的解决方法 丢失更新概念:当用户同时修改一行数据,他们先读取数据,放在前端进行修改,当修改后,再提交数据,这样最后提交的数据会覆盖先前提交的数据,这样就造成了丢失更新。长话短说,介绍防止丢失更新的方法:使用RowsVersion时间戳。每次更新的时候,mssql都会自动的更新rowversion的值,若一行在读前与更新前的值前后不一致,就说明有其他的事务更新了此列,这样就可以不更新此列,从而防止了丢失更新的情况。例子 : declare table tmp(a varchar(10),b rowsversion) insert into tmp(a) values( abc)事务A:declare rv rowversionselect rv=b from tmp where a=abc waitfor delay 00:00:05update tmp set a=xyz where b=rv事务B:update tmp set a=aaa where b=rv事务A在执行完毕后会发现并没有将aaa给抹去,这样就防止了丢失更新的现象。2 SSIS中VB代码的使用首先讲一下VB的概述2.1 VB的概念及使用 Visual Basic(简称VB)是Microsoft公司开发的一种通用的基于对象的程序设计语言。 “Visual” 指的是开发图形用户界面 (GUI) 的方法不需编写大量代码去描述界面元素的外观和位置,而只要把预先建立的对象add到屏幕上的一点即可。 “Basic”指的是 BASIC (Beginners All-Purpose Symbolic Instruction Code) 语言,一种在计算技术发展历史上应用得最为广泛的语言。Visual Basic 在原有 BASIC 语言的基础上进一步发展,至今包含了数百条语句、函数及关键词,其中很多和 Windows GUI 有直接关系。专业人员可以用 Visual Basic 实现其它任何 Windows 编程语言的功能,而初学者只要掌握几个关键词就可以建立实用的应用程序。Visual Basic Scripting Edition (VBScript) 是广泛使用的脚本语言,它是 Visual Basic 语言的子集,可嵌入HTML语言中,用于网页设计,如ASP(Active Server Page)文件。VB简单易学,通用性强,用途广泛。2.1.1 VB中方法声明2.1.2 VB中变量声明 变量:变量是应用程序在运行的过程中用来临时保存数据的地方,它的值随赋值而改变。 为了使用变量,需要为变量指定一个名称和规定该变量所保存数据的类型, 这项工作称为声明变量。 1.用Dim语句显式声明变量 (1)一般格式: Dim 变量名 AS 类型 例如: dim a1 as integer 声明整数型变量a1 dim a2 as strin 声明字符串变量a2 dim s as Single 声明单精度实数变量s dim ss as Double 声明双精度实数变量s 使用声明语句声明变量之后,VB自动对各类型变量进行初始化,数值变量被初始化为0;字符串变量被初始化为一个零长度的符串(”)。2.1.3 VB中函数2.1.4 VB中IF语句2.1.5 VB中SELECT CASE 语句2.1.6 VB中For循环语句2.1.7 VB中MsgBox函数2.2 VB在SSIS中的使用方法如下2.2.1 VB在SSIS简单使用如下2.2.2 VB跟SSIS怎么集成使用如下实例: 脚本任务允许利用Microsoft Visual Studio环境来使用VB.NET语言创建和执行脚本。ActiveX任务允许从SQL Server 2000中执行脚本。与ActiveX任务相比,脚本任务有一些优点。如下列举。一整套智能设计环境轻松地向脚本传递参数轻松地在脚本代码中设置断点可以以二进制形式预编译脚本 在脚本任务的编辑界面内如图3-17有一个脚本语言选项用来选择编辑语言,对于SQL Server来说只能选择VB.NET。如果PreCompileScriptIntoBinaryCode选项设置为true,脚本将会编辑并加快任务运行,这样做的副作用是package将会变大。 EntryPoint选择项用来设定程序入口。ReadOnlyVariables选项和ReadWriteVariables选项允许想脚本中传递SSIS变量,ReadOnlyVariables表明该变量只读,ReadWriteVariables表明该变量可读写。多个变量之间可以用逗号隔开。点击Design Script可以编辑脚本。 点击Design Script之后打开Visual Studio环境,在这个环境中可以调试,设置断点。下面的一个列子演示脚本怎样获得传递的系统变量。脚本首先判断变量是否存在,然后弹出一个消息框显示任务的名字。 这里交接一下ActiveX脚本,为保证向后兼容SQL Server 2000 DTS在SSIS中保留ActiveX脚本,你会发现ActiveX脚本任务不是种高级任务,脚本任务可以完全代替它。和脚本任务一样,它也在编辑页面中配置。在早先的SQL Server 2000中,它支持除VBScript外的多种语言。EntryMethod属性指定要这姓的方法,也可以点击省略号浏览选择脚本文件。 注意:浏览选择将会覆盖已经选择的脚本。2.2.3 SSIS与VS集成的高级使用如下:上面包含变量的声明,赋值,使用,弹出对话框等功能模块。3 SSIS中脚本首先讲一下SSIS脚本的说明3.1 脚本任务的概述 数据转换服务中有执行客户SQL脚本的转换,在SSIS中这个特性得到加强。在SSIS中可以使用VB.NET这种语言。这个系列中将介绍这些脚本任务,例如控制执行流程,实现自定义转换,并举例说明。在SSIS中有下面几种脚本任务。SSIS中有三种脚本:表达式,控件流脚本,数据流脚本。 表达式是使用SSIS自定义的表达式语言来实现一些逻辑,例如导出列转换,使用表达是语言来筛选出符合规则的数据。 控件流脚本是通过Script task实现的。通过它可以控制包的执行。例如,现在需要在工作时间给一位客户发送邮件,非工作时间给另外一个客户发送邮件,可以使用script task来判断时间发送合适的邮件提示。 数据流脚本用在自定义转换中。一个例子是判断一个源表中的数据值,参照另外一个表中的数据将源表中的值转换成另外一种格式。假设现在要从一个大型机中抽取数据,在数据源中没有验证数据的方法,所以在导入数据之间要对她惊醒验证。这种类型的处理是Script Component最擅长的。先开个头,后面的将会具体介绍各种脚本处理。3.2 SSIS中的脚本表达式 表达式是使用一些元素组合起来产生一个唯一的值。这些元素包括变量,字面值,函数,存储过程和运算符。一个简答的表达式是12,它的结果是true。虽然表达式是从C语言中衍生出来,但是他们大小写不明感。 SSIS中很多的任务都支持表达式。所有的任务都支持使用表达式来配置属性。例如For Loop和Foreach Loop中可以使用表达式来设置循环条件,Derived Column任务可以使用表达式来定义输出。3.2.1 动态属性 SSIS中通过表达式可以动态的执行转换任务。右击任务选择编辑,打开编辑界面。在左方有一些归类标签,点击这些标签可以打开一类相关的属性。每一种任务都会有一个表达式标签,如图1 在这个编辑框中有两个列,一个是表达式名字,一个是表达式的值。在表达式名字中可以打开一个下拉列表,在这个表中选择要用的表达式,之后就可以在值这个列中编辑一个表达式值。在编辑表达式值的时候也可以点击右边的园形按钮打开表达式值编辑器。如图2点击右边栏中表达式旁边的加号可以查看所有的表达式。点击文本框旁边的圆形按钮可以打开表达式编辑框,如图3 这个编辑器非常强大,左边框中的树形结构罗列出要编辑的表达式。在右边框中的树形结构罗列了所有可以使用的表达是函数和操作符。点击一个函数或者操作符的时候在下方Description栏中将会自动展示一些解释说明。也可以直接点击想要的表达式或者表达式函数到编辑框中而不是手动键入。 在表达式编辑器中设置表达式,注意表达式的值要和表达式相符,例如如果选择DelayValidation属性,那么表达式的结果一定要是一个布尔类型。设置好之后可以店家Evaluate Expression来验证,如果不符则会弹出错误提示。例如我们输入字母a则会得到如图4的错误提示。3.2.2 任务中的表达式: 在任务中也可以使用表达式。最典型的就是Derived Column任务。下面我们看看在Derived Column中我们如何使用。新建一个包,在Control Flow中拖放一个Data Flow Task,双击进入Data Flow,在其中拖放一个OLE DB数据源,选择视图HumanResources.vEmployee。在Columns标签中只选择FirstName,MiddleName,LastName三个列。添加一个Derived Column任务,把它和数据源连接起来。双击Derived Column打开编辑器,可以看到如图5的界面,这个界面可表达式编辑器非常的相似。不同的地方在表达式边界框中,这里不是一个文本框,而是一个用来编辑输出列的可以编辑的表格。 在第一列中输入FullName,在Derived Column列中选择,最后在Expression这一列中输入如下的表达式:FirstName + + MiddleName + + LastName这个表达式非常的简单,只是将所有名字连接起来作为一个完整的名字,中间是偶那个空格隔开。 点击OK保存,关闭表达式编辑界面。添加一个平面文件或者是Excel格式的数据目的,把他和Derived Column连接起来。最后运行这个包。这里我们选择使用Excel格式的数据目的。运行成功之后可以看到如图6的结果。 我们会发现FullName这一列中有一些列是空的,这是因为有一些人没有MiddleName,使得表达式的值有误,这样的结果不是我们希望的。我们需要判断MiddleName的值。打开表达式编辑器重新编辑如下:FirstName + (ISNULL(MiddleName)? : + MiddleName + ) + LastName这里使用ISNULL函数判断然后使用问号表达式来处理MiddleName。这个函数是从C语言演化而来的。三元表达式和VB中的IIF函数很相似。最后保存关闭编辑器。最后查看Excel文件,这次每一行都都有一个值,如图7新的表达式语言为SSIS提供了强大的功能,使用起来更加便捷。更加详细的介绍在SQL Server 2008联机丛书中可以找到。3.3 SSIS中的脚本脚本任务3.3.1 脚本任务 脚本任务主要用来控制数据流,当现有的控制流 任务不能满足复杂的设计要求的时候,就应该考虑使用脚本任务。这里我们创建第一个脚本任务,和其他的教学例子一样,我们也将创建一个简单的HelloWord程序。1.新建一个package 命名为ScriptTaskExample2.在Control Flow内拖放一个Script,如图13.双击打开编辑界面如图24.点击左边Script标签,打开界面如图35.这里有几个属性标签下面做一些说明a. ScriptLanguage:在这里可以设置要使用的语言。SSIS2005版本中只支持Visual Basic.NET,后续版本中添加了C#b. PrecompileScriptIntoBinaryCode:设置这个属性为true的时候,脚本在执行之前就被编译,这样可以提高性能。设置为false,在调用script的时候才会编译脚本。当在SQL Server Agent job中调用这个package的时候需要将这个属性设置为truec. EntryPoint:这个属性设置为Mian,表明程序的入口是Main方法d. ReadOnlyVariables:一个用逗号隔开的字符串,包含可以被程序读取的SSIS变量e. ReadWriteVariables:一个用逗号隔开的字符串,包含可以被程序读取和写入的SSIS变量6.在左边标签栏还有一个Expressions我们在前面的章节已经说明,这里不再解释。7.点击Edit Script按钮打开Visual Studio编辑界面如图4所有的代码编辑都在这个Visual Studio for Application界面中进行,它也包含所有的代码编辑调试工具,包含代码高亮显示和智能感知。这里的代码非常的简单,开头的代码:这段 程序到目前为止还没有添加自己的代码,仅仅是关于程序如何运行的说明和Dts.TaskResult值的设置。必须设置这个变量的值为true或false,否则SSIS运行时不知道程序是否执行成功以便采取下一步行动。3.3.2 DTS对象Dts是类Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptObjectModel类的一个实例,Dts对象有7个属性和一个方法,下面我们说明这些成员 a. Connections-包中定义的一个连接,使用这个连接可以获得检索外部数据 b. Events-一个事件的集合,使用这个接口可以捕获到预定义事件,扩展事件 c. ExecutionValue-一个可读写的属性,通过这个属性可以附加自定义属性,使用自定义的对象可以附加任何想要的信息 d. TaskResult-这个属性可以设置任务状态为成功或失败,这是控制语句流的唯一方法,退出之前必须设置这个属性 e. Transaction-获得容器中的事务 f. Log-这个方法用来写日志Dts对象提供和package交互的所有属性,要注意的是Dts只存在于Script task中,在Script Compontent中没有这个对象3.3.3 访问变量变量是script task中的一个重要属性,它是一个和package交互的工具。在script task中的变量有两种类型,只读的和读写的,在script task中有两种方式获得变量,VariableDispenser对象提供设置变量只读和读写的属性,这是标准方法,在早期的SSIS中使用API。检索VariableDispenser对象中的变量的代码如下:Dim vars As VariablesDts.VariableDispenser.LockForRead(SomeVariable)Dts.VariableDispenser.GetVariables(vars)MsgBox(vars(0).Value)这里用四行代码不是很高效,所以在Dts对象中引入了Variables集合和ReadOnlyVariables,ReadWriteVariables属性,这两个属性告诉script task那些变量需要设置只读或读写属性,Variables集合用来填充变量,代码简化如下:Msgbox(Dts.Variables(SomeVariable).Value)尝试从Variables集合中读取没有赋制值的变量将会抛出异常,注意Visual Basic.NET大小写敏感,但是SSIS中的变量不敏感。要访问Variables集合中的变量,必须事先设置他们的只读或读写属性。调用一个名为StringVariable的变量的方法如下:Variables.StringVariable3.3.4 事件Script task中的事件可以用日志记录下来,事件是从对象中发送一个消息标明一个动作正在发生或者将要发生。程序通过事件处理程序来捕获事件。使用Dts对象中的Events属性来发起一个事件,Events属性是IDTSComponentEvents接口的一个实现对象,这个接口中定义了可以触发的事件。a. FireBreakpointHit-运行到断点时触发事件b. FireError-程序出错时触发事件c. FireInformation-使用消息触发事件d. FireProgress-遇到progress的时候触发事件f. FireQueryCancel-触发一个事件表明是否停止执行包g. FireWarning-程序出现警告时触发事件h. FireCustomEvent-触发用户自定义事件 在SSIS中所有的事件都可以写入到一个日志中,这在调试和解决问题中很有用。在SSIS Logging工具中设置日志记录。在BIDS界面上方点击SSISlogging,弹出SSIS日志编辑界面,在Provider Type下拉框中选择XML files,点击Add。点击设置打开File Connection Manager编辑框,选择Usage type为Create file,将文件命名为log.xml选择文件路径,点击选中设置好的xml文件如图5点击Details标签,选中OnInformation,只有这种事件将会被记录如图6现在回到脚本编辑界面,添加下面的代码:Dts.Events.FireInformation(1, MyScriptTask, Some Info here, , 0, False)该方法的第一个参数是消息代码,用来标识消息,这个值可以任意设置。第二个参数用来设置事件源,这个值仍然可以任意设置。第三个参数是消息本身。第四个参数是帮助文件的地址,这里设置为空,因为在这里帮助文件不需要。第五个参数是帮助主题内容,这里没有帮助文件所以设置为0。最后 一个参数是一个布尔类型变量指示是否这个错误会被多次捕获,这里设置为false,表示不会多次捕获,即使多次调用这个代码。运行这个package,最后事件信息记录如下图7图7这里记录了事件触发时间,package所在的机器名和用户名等信息。也可以设置自己的事件捕获程序,将在后面介绍。3.3.5 日志Log方法用来记录日志信息,它有3个参数 messageText-要记录的日志信息 dataCode-记录日志信息代码 dataBytes-记录二进制日志数据Log方法和FireInformation方法类似,它更加简单有效,下面的方法将二进制日志信息记录到日志提供程序中:Dts.Log(my message, 0, myByteArray)3.3.6 调试脚本任务 调试是SSIS中的重要特性,使用Msgbox()方法输出变量值的日子一去部复返了。使用Visual Studio的编辑环境可以设置断点,测试变量的值,甚至可以运行表达式。 设置断点使程序在次停留,查看程序的运行情况。有多种方法可以设置断点,一种方法是在代码行左侧灰白色边框上点击鼠标左键。另一种方法是光标停留在代码行上点击F9。点击F10使程序运行到下一行,或者点击F5运行到下一个断点。运行到断点处时界面如下Immediate窗口允许给表达式赋值,执行存储过程,打印变量值,这个窗口和dos命令窗口类似,允许向编辑器发送命令。Immediate窗口非常有用。例如一个自定义的类型,它有方法DoMyStuff()接受一个整数值作为参数,使用Immediate窗口,可以向它传递不同的值并查看返回值,给表达式赋值的时候需要使用?开头:?obj.DoMyStuff(2)Hello按下Enter键,在下一行输出结果Hello。4 SSIS中包调用包说明SSIS中包调用包说明错误Bug解决4.1 包调用包连接说明及错误解决方案 包里面调用包文件直接写已存在的包文件名就行了,不需要指定具体的路径。4.2 包调用包,文件安全说明错误信息: 无法解密受保护的 XML 节点“DTS:Password”,错误为 0x8009000B“该项不适于在指定状态下使用。”。可能您无权访问此信息。当发生加密错误时会出现此错误。请确保提供正确的密钥。 错误结束 错误: 2011-09-26 18:02:57.46 代码: 0xC0016016 源: 说明: 无法解密受保护的 XML 节点“DTS:Password”,错误为 0x8009000B“该项不适于在指定状态下使用。”。可能您无权访问此信息。当发生加密错误时会出现此错误。请确保提供正确的密钥。 错误结束 DTExec: 已返回包执行 DTSER_FAILURE (1)。 开始时间: 18:02:56 完成时间: 18:02:57 占用时间: 1.906 秒. 包执行失败。. 该步骤失败。解决方案:【如果有包文件,引用包文件,必须把相应的包文件的属性调整过来,调整成ProtectionLevel : DontSaveSensitive,这样就解决了在Job上发布报错的问题了,请注意.】例子说明:4.3 包配置文件目标:通过XML配置源、目标数据库的连接设置,为动态设置源、目标数据库服务;1、 进入包配置界面;2、 制定包配置文件后(如 Config.dtsConfig),选择源、目标 两个连接的 “ ConnectionString ”字段,一直点击“下一步”即可;3、 如果源、目标数据库设有密码,则需要手动到保存的 dtsConfig 文件中增加数据库密码信息;4、 XML中,数据库配置格式如下:Data Source=IP地址;User ID=用户名;Password=密码;默认产生的XML中可能没有密码信息,需要手动添加Initial Catalog=数据库名称;Provider=SQLNCLI10.1;Persist Security Info=True;5、 数据库动态连接可在所有的dtsx包配置中启用包配置,指向同一个配置文件,并且可以复用现有配置 (注:此处不要覆盖);6、 启用包配置,每一个dtsx包都要做一次设置,不能省略;7、 右键SSIS_RDC工程,选择属性进入属性配置页;8、 在“部署实用工具”中,将属性“CreateDeploymentUtility”设置为 True;9、 设置“DeploymentOutputPath”路径,默认为bin/Deployment;10、 右键 SSIS_RDC工程,选择重新生成,则系统会将 dtsx包文件、dtsConfig配置文件 一起生成到指定的路径下;5 SSIS基础知识讲解SSIS基础知识讲解5.1 SSIS基本的概念 5.1.1 SSIS概要俗话说:“十年磨一剑”,Microsoft 通过5年时间的精心打造,于2005年浓重推出Sql Server 2005,这是自SQL Server 2000 以后的又一旷世之作。这套企业级的数据库解决方案,主要包含了以下几个方面:数据库引擎服务、数据挖掘、Analysis Services、Integration Services、Reporting Services 这几个方面,其中Integration Services (即SSIS),就是他们之间的中转站、纽带,将各种源头的数据,经ETL到数据仓库,建立多维数据集,然后进行分析、挖掘并将结果通过Reporting Services 送达给企业各级用户,为企业的规划决策、监督执行保驾护航。SSIS 其全称是Sql Server Integration Services ,是MicrosoftBI 解决方案的一大利器,是Sql Server 2000中DTS 一个升级之作。 无论是功能上,性能上,还是可操作方面都有很大的改进。且看下面的操作界面就可见一斑。SQL Server 2000 DTSSql Server 2008 SSIS现在很多人都把SSIS 说成是一个ETL (Extract-Transform-Load)工具,我个人觉得不太准确,或许是大家基本上都把他做为ETL 使用,其实SSIS已经超越了ETL的功能,ETL 仅是其中之一,它在其它方面也有非常突出的表现:(1) 系统维护:a) 在数据库维护方面: i. 数据库备份; ii. 统计信息更新; iii. 数据库完整性检查; iv. 索引重建 v. SSIS 包执行; vi. SSAS 任务处理。b) 业务处理: i. 执行SQL 任务。 ii. Web Service 任务。c) 操作系统维护: i. WMI事件观察器任务 ii. 文件系统任务。d) 其它: i. 执行SQL 任务 ii. 执行进程任务 iii. ActiveX 脚本任务 iv. 脚本任务(VB/C#). v. 执行Web Service 服务 尤其是上面的第四点,可以执行SQL 任务,可以执行Web Service 服务,可以执行系统进程,可以执行(VB/C#)脚本任务,这给了我们多大想象的空间,还有什么例外的?强啊。不得不佩服务一下。 SSIS 的体系结构主要由四部分组成:Integration Services 服务、Integration Services 对象模型、Integration Services 运行时和运行时可执行文件以及封装数据流引擎和数据流组件的数据流任务(如图): 这是我们初学者必须要了解的,只要明白了这个体系统结构,体会了各组成部分之间的关系,清楚了什么是控制流、什么是数据流,SSIS学起来就不难了。总之,SSIS 并不简单的是DTS 的一个升级版,除了上面所说的几个方面的改进外,在开发环境方面,Microsoft 还一如继往地发挥着他的优势,与Visual Studio 紧密集成,让开发人员可以在一个更加熟悉,更加方便的平台上设计、开发,大大降低了入门的门槛,加速了学习、开发的进度。它的组成元素也更加对象化,每一个包、每一个任务、每个一控制流、每一个数据流,都是一个独立的对象,有其对应的属性、对应的事件。VB/C# 的脚本任务;变量、属性的参数化,更是让人震撼,几乎是无所不能,无所不可似的(有些夸张了,我不是托,只是感觉比以前强大太多了)。使用起来也并不复杂,只要你安装了SQL Server Integration Services 10.0 服务(SQL 2005 应该是Integration Services 9.0),New project ,选择Integration Services 项目,就可以一睹芳容,亲密感受他的博大与精深了。5.1.2 SSIS数据流任务上数据流任务是SSIS中的一个核心任务,估计大多数ETL包中,都离不开数据流任务。所以我们也从数据流任务学起。数据流任务包括三种不同类型的数据流组件:源、转换、目标。其中:源:它是指一组数据存储体,包括关系数据库的表、视图;文件(平面文件、Excel 文件、Xml 文件等);系统内存中的数据集等。转换:这是数据流任务的核心组件,如果说数据流任务是ETL的核心,那么数据流任务中的转换,则是ETL核心中的核心了。它包含非常丰富的数据转换组件,比如数据更新、聚合、合并、分发、排序、查找等。可以说SQL语句中有的功能,它都基本上运用起来了。目标:与“源”相对应,也是一组数据存储体。包含表、视图;文件;多维数据集、内存记录集等。除以上三类组件外,还有一种组件,那就是”流(Flow)“,它形象地显示了数据从”源“,经过”转换“,最后到达”目的“地的一组路径。我们可以利用”流“,来查看数据,添加备注说明等。下面一幅图,就充分展示了源、转换、目的、流的关系。下面我们以将IIS Log 导入数据库为例,来介绍如何进行数据流任务开发。在开发之前,我们先来看看IISlog 的结构,如图:它基本上记录了网页浏览的所有信息,如日期、时间、客户IP、服务器IP、页面地址、页面参数等很多信息,我们再根据这些信息,在关系型数据库中,建立一张对应表,来记录这些信息。代码 CREATETABLEdbo.IisLog(c_DatedatetimeNULL,c_Timevarchar(10)NULL,c_Ipvarchar(20)NULL,cs_Usernamevarchar(20)NULL,s_Ipvarchar(20)NULL,s_ComputerNamevarchar(30)null,s_Portvarchar(10)NULL,cs_Methodvarchar(10)NULL,cs_Uri_Stemvarchar(500)NULL,cs_Uri_Queryvarchar(500)NULL,sc_Statusvarchar(20)NULL,sc_SubStatusvarchar(20)null,sc_Win32_Statusvarchar(20)null,sc_Bytesintnull,cs_Bytesintnull,time_Takenvarchar(10)null,cs_Versionvarchar(20)null,cs_Hostvarchar(20)null,cs_User_Agentvarchar(500)NULL,cs_Referevarchar(500)NULL)ONPRIMARY万事俱备,下面我们就可以开始ETL的开发之旅了,打开Visual Studio 2008工具,文件-新建-项目,选择“Integration Services 项目”,ETL的开发界面就跃入眼帘,这是从事.Net 开发的朋友们非常熟悉的界面。打开左边“工具箱”,将“数据流任务”拖到主窗口“控制流面板”,如图所示:然后双击“控制流”面板上的“数据流任务”,进入“数据流”面板,这两部分UI没有什么差异,只是所实现的功能不同罢了。真正的数据流任务开发,从现在才算开始。打开左边“工具箱”,可以看到有三大部分:数据流源、数据流转换、数据流目标。我们从“数据流源”中,将“平面文件源”拖到主窗口下,双击打开“平面文件源”编辑器,点击“新建”,打开平面文件连接管理编辑器,如图:输入连接名称,选择IisLog 文件,选择行分隔符、列分隔符,就可以从预览窗口看到数据的真面目了。这里有一点要注意,不同的平面文件,其行分隔符、列分隔符都是不一样的,如果选不正确,将达不到你想要的效果,所有的数据都可能挤到一列中去了。一般行分隔比较简单,基本上都是以回车换行(CRLF)来分隔;列分隔符却不一样了,它既可以以任意文本字符来分隔,比如逗号(,)、分号(;)、冒号(:)tab符、竖线(|),以及常用的文字字符、数字字符,也可以定义每一列的固定宽度来分隔。这就需要视文件源不一样,分别对待了。在平面文件连接管理器中,选择“高级”,还可以定义每一列的列名、数据类型、字符长度等信息。等一切定义完成,点击确定,返回到平面文件编辑器界面,前面建立的连接将自动返回到“平面文件连接管理器”的下拉列表框中,下面就要以选择需要输出的列了,如图: 然后再选择“错误输出”,缺省选项如下图所示: 这一选项非常重要,是要求我们配置当源数据发生错误的时候该如何处理,一般源数据发生错误有两种情况:一是数据类型错误,比如日期格式错误、数字变字符了等;另一情况就是字符太长,超出列宽了。根据不同的情况,其处理方式也不一样,系统提供了三种解决办法:忽略失败:是指如果某一行数据错误,忽略此行,不影响程序执行,继续导入其它数据。重定向行:将错误的数据行,导入到另外一个数据流目标,供以后人工检查后,再重新处理。组件失败:这是最严格的,只要遇到数据错误,组件立即失败,停止运行。就IISLOg 这样的数据源文件来说,有错误数据行,那是是经常发生,但是这些少量数据错误,也不会影响最终的结果,我们就要以考虑容错性为主了,放宽对数据质量的要求,一般选择“忽略错误”,以方便程序继续运行。 一切都定义完后,我们看到“平面文件源”控件上,还有一个红色的叉(X),那是指没有为此数据源定义目标,那就是下一步要定义的。另外下面还有两个长线箭头,一个绿色,一外红色,其中绿色:表示正确数据流通路,红色表示错误数据流通路,如果前面定义错误“重定向行”,那么错误数据将沿着红色路径,流向错误数据存放地。定义数据源目标,这可能要简单一些了,同理从左边工具箱中,看到有很多种类型的数据源目标,我们选择“OLEDB目标”,将“平面文件源”控件下的绿色箭头连接到“OLEDB目标”,然后双击,打开“OLEDB目标编辑器”窗口,“新建”数据库连接,如图:返回到“OLEDB目标编辑器”窗口,在数据访问模式下,选择“表或者视图-快速加载”一项,然后再选择对应的表,如图:下面配置列映射,如图:如果没有的列,直接忽略即可(前提是表中该列允许为空),后面仍然是配置错误处理方式,参照平面文件源错误处理方式即可。到此为止,一个简单的数据流任务就基本上完成了,点击运行,我们期待已久的结果出现了。当然,在实际开发过程中,可能并没有这么顺利,会遇到很多各种各样的问题,在这篇文章中我们很少提及,主要是因为这仅是个开始,没有涉及到这么深入,在以后的专题中,会逐渐讲解。一个简单的数据源任务就算完成了,其实这只是一个Demo ,让大家了解了一个概况,可以说万里长城只是走出了第一步,真正的ETL不会这么简单。下后面我们将介绍ETL最精彩的部分“数据流转换”,敬请期待。5.1.3 SSIS数据流任务下前一篇文章SSIS 学习(2):数据流任务(上),介绍了如何创建一个简单的ETL包,如何通过一个简单的数据流任务,将一个文本文件的数据导入到数据库中去。这些数据都保持了它原有的本色,一个字符不多,一个字符地少导入,但是在实际应用过程中,可能很少有这种情况,就拿IisLog文件来说吧,其中包含有:请求成功的记录(sc-Status=200),也有请求失败的记录;有网页(比如:*.aspx、*.htm、*.asp、*.php等)、有图片、有样式表文件(*.CSS)、有脚本

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论