通过基本task和transforms的学习,现在可以转入到SSIS实际应用。建立端到端的package这个系列中首先讲解将一系列的文件数据导入到SQL Server中的方法,然后添加一些复杂转换,最后将看到如何在package中处理错误和动态地创建package。
创建一个项目
使用SSIS的首要目的是从数据源中读取数据,然后写入Destination中,这个向导介绍从平面文件中读取数据。使用下面的文字
32008 FL BRANFORD
32009 FL BRYCEVILLE
32011 FL CALLAHAN
32013 FL DAY
32033 FL ELKTON
32034 FL AMELIA ISLAND
32038 FL FORT WHITE
32040 FL GLEN SAINT MARY
32043 FL GREEN COVE SPRIN
32044 FL HAMPTON
32046 FL HILLIARD
32052 FL JASPER
32053 FL JENNINGS
32054 FL LAKE BUTLER
32055 FL LAKE CITY
32058 FL LAWTEY
32059 FL LEE
32060 FL BOYS RANCH
32061 FL LULU
32062 FL MC ALPIN
32063 FL MACCLENNY
32065 FL ORANGE PARK
32066 FL MAYO
32068 FL MIDDLEBURG
32071 FL O BRIEN
32073 FL ORANGE PARK
32082 FL PONTE VEDRA BEAC
32083 FL RAIFORD
32084 FL SAINT AUGUSTINE
32086 FL SAINT AUGUSTINE
32087 FL SANDERSON
32091 FL STARKE
32092 FL SAINT AUGUSTINE
32094 FL WELLBORN
32095 FL SAINT AUGUSTINE
32096 FL WHITE SPRINGS
32097 FL YULEE
32102 FL ASTOR
32110 FL BUNNELL
32112 FL CRESCENT CITY
32113 FL CITRA
创建ZipCode.txt文件,这个文件包含美国邮政编码。新建一个项目,选择项目类型Integration Service Project,如图5-1,将默认的package文件Package.dtsx重命名为ZipLoad.dtsx。
图5-1
创建连接
我们创建一个能在多个package中使用的连接,在解决方案管理器中右击Data Source文件夹新建一个数据源,打开数据源向导,选择“Create a data source based on an existing or new connection”点击New,代开连接管理器。
注意:有多种方式建立数据源连接,例如,可以在Data Flow中拖放数据源任务。
选择Native OLE DB\SQL Native Client,输入连接名字,为方便读写数据库选择授权模式,最后选择AdventureWorks数据库,点击OK。如果没有安装AdventureWorks数据库可以任意选择一个数据库,然后测试连接,将数据源命名为AdventureWorks。在DataFlow拖放数据源的方式不能共享数据源,在下面ConnectionManagers中点击新建连接时可以看到我们已经创建好的一个连接,在所有的package中都可以选择这个连接。
下一步,新建一个指向ZipCode.txt的平面文件链接,在Package Designer中右击选择新建文件链接,命名为ZipCode Extract,指向连接C:\SSISDemos\ZipCode.txt。
Format下拉列表选择默认的Delimited,Text qualifier默认选择<none>。Text Qualifier用来设定字符串的分隔符。在文本中以逗号分隔是这个选项设置会很有用,他会忽略这些符号只抓取文本。在这个例子中文本内容没有分隔符,所以保持默认选择<none>。Header row delimiter选项设置为Tab{t},并选中Column names in first data row单选框,最终的界面如图5-2
图5-2
点击Columns进入标签界面,Row Delimiter默认设置{CR}{LF},意思是使用回车换行来分隔行。Column Delimiter选择项保持默认设置Tab{t},意思是使用制表符区分列。由于选中了Column names in first data row选项所以这里看到第一行的显示的是数据而不是列名。
点击Advanced进入标签界面,在这个界面中可以设置每一个列的数据类型。默认的类型是50个字符的字符串,在这个例子中比实际要长。选中ZipCode,点击Suggest Types打开Suggest Column Types对话框,一般情况下保持默认选项,点击OK选择合适的类型。然后可以看到数据类型变成了two-byte signed integer [DT_I2],这种类型在一般情况下会满足要求,如果邮编号码以0开头时会出现错误,所以点击下拉列表框选择string [DT_STR],OutPutColumnWidth选项设置为5,最后TextQualified选项选择false,如图5-3。
图5-3
创建任务
创建好连接之后可以接着创建任务,首先在Control Flow中拖放一个Data Flow Task并重命名为Load ZipCode Info。
创建数据流
双击Load ZipCode Info进入Data Flow界面,在这里进行更详细的设计。细心的话会看到在工具栏中的工具列表发生变化。
在DataFlow界面中拖放一个Flat File Source并成命名为Florida ZipCode File,双击打开编辑界面如图5-4默认选中上面我们创建的连接ZipCode,点击Columns可以看到要导出的列,点击OK退出编辑界面。
图5-4
下一步,拖放一个SQL Server Destination重命名为AdventureWorks,使用绿色箭头把它和Florida ZipCode File连接起来。双击AdventureWorks选择AdventureWorks数据连接,在User a table or view下拉选项中New在这里可以编写代码新建表而不需要在SQL Server Management Studio中新建表,修改默认的建表语句后如下:
2 [ Zipcode ] VARCHAR ( 5 ),
3 [ State ] VARCHAR ( 2 ),
4 [ ZipName ] VARCHAR ( 16 )
5 )
注意:如果没有使用箭头和上一个task连接的话,这里不能点击New按钮。完成建表语句之后点击下拉列表框可以看到多了一个选项ZipCode,在Mappings标签界面中还可以看到字段映射。SSIS总是按照名字来映射,创建的表中的字段名和数据源中的是一致的,所以看到三条平行的映射,如图5-5
图5-5
为使这个Package更加完整,保证每次都可以运行这个Package,回到Tontrol Flow界面拖放一个Execute SQL task,重命名为Purge ZipCode Table,双击打开编辑界面,在Connection下拉列表中选择AdventureWorks连接,在SQL Statement选项中打开编辑界面输入下面的SQL语句:
DELETE FROM ZipCode
点击OK完成编辑,把它放在Load ZipCode Info任务的上面,使用箭头把他们连接起来。整个Package就完成了,点击保存按钮,值得注意的是在这里保存的是.dtsx文件,并没有保存到服务器中,部署package在后面的随笔中讲解。
执行包
完成编辑之后,可以点击debug按钮运行,或者右击ZipCode.dtsx点击Execute Package。在运行之前会花费几秒钟时间来编译和验证。在Output界面可以看到运行过程,然后看到task的图标由黄变绿,证明Package执行成功。如果执行失败在Output 界面可以看到错误信息。如果Output界面没有打开可以点击View-Other Windows Output。
在Data Flow界面会看到具体导入了多少行,界面如图5-5。
图5-5
这里要注意,上面创建txt文件的时候我只复制了一部分内容,如果你在自己的机器上实验,这里应该41 rows。这里在默认情况下,在调试状态下对Package中所做的任何修改都不会被编译运行直到下一次运行。点击Stop Debugging停止运行。
问题
在这里可能遇到一个问题,点击运行的时候并没有像上面所说的那么顺利,出现了错误,提示如图5-6:
图5-6
借助强大的百度我们找到了问题的症结和解决方案,首先把这个地址贴出来
http://support.microsoft.com/kb/2009672
- 症状:SSIS中创建一个包含了SQL Server Destination的数据流任务,当尝试运行Package的时候,如果使用的是Windows7或者Vista操作系统,系统会打开UAC,是微软为提高系统安全而在Windows Vista中引入的新技术,它要求所有用户在标准账号模式下运行程序和任务,阻止未认证的程序安装,并阻止标准用户进行不当的系统设置改变。在这种情况下你会遇到这个错误提示: SQL Server Destination] Error: Unable to prepare the SSIS bulk insert for data insertion.
[SSIS.Pipeline] Error: component "SQL Server Destination" failed the pre-execute phase and returned error code 0xC0202071. - 原因:在打开UAC功能的系统中,当程序如SSIS被管理员群组的用户执行时有两种安全令牌,一种低级别的,一种较高级别的。运行程序的时候选择“Run as Administrator”时会使用较高级别的,默认情况下SSIS程序在连接数据库的时候会使用低级别的。
- 解决:如果是在SQL Server Management Studio (SSMS) 或 Business Intelligence Development Studio (BIDS) 或 DTExecUI.exe中运行Package,重新代开程序并选择Run as Administrator。如图5-7,然后弹出询问对话框如图5-8,点击Yes打开程序重新运行Package。 图5-7 图5-8
至此一个简单的package就完成了,我们将txt文件中的内容导入到数据库中,在数据库中使用语句SELECT * FROM ZipCode就可以查出数据,他们和txt的内容是一样的。