本篇文章是Integration Services系列的第二篇,详细内容请参考原文。
简介
SSIS用于移动数据。数据流任务提供此功能。因为这个原因,当介绍SSIS时我喜欢从数据流任务开始。
数据流任务的基础知识
我认为从SSIS数据流任务的基础开始有利
图2.1 数据流任务
在图2.1我们看到一个非常简单的数据流任务:通过OLE DB源从数据库读入数据到数据流任务,然后通过OLE DB目标写入到目标数据库。源和目标适配器通过连接管理器与数据库和其他数据存储区进行交互。现在让我们把焦点放在数据流任务的内部操作上。
图2.1有三个对象
1、OLE DB源
2、OLE DB目标
3、连接源和目标的数据流路径(绿箭头)
连接管理器和OLE DB源适配器
OLE DB源适配器连接到一个连接管理器。连接管理器在数据流编辑器底部的一个小标签中:
图2.2 连接管理器
连接管理器最重要的是:连接管理器是SSIS包和外部数据源之间的桥梁。连接管理器处理诸如服务器名称和数据库实例(如适用)、数据库名称和凭据。OLE DB源适配器处理表和列。
OLE DB源适配器执行连接管理器中配置的服务器/数据库查询,在提供的凭据上下文。一些重要的事项:
首先,SSIS不会存储或保存解密密码。如果你的连接需要一个密码,你勾选了保存密码复选框,你的SSIS包是加密的。
如果你使用Windows身份验证,SSIS将内部存储你的密码并且加密,,连接管理器会以执行包的用户上下文连接到数据库。
OLE DB目标适配器
OLE DB目标适配器也作为数据流任务和连接管理器之间的一个接口(或桥梁)。Rows流入OLE DB目标适配器,写入到OLE DB目标编辑器中指定的目标表。
数据管道
在数据流任务中数据流路径将源适配器、转换和目标适配器连接。在图2.1的数据流任务中没有转换——所以数据流路径管道将所有的数据从OLE DB源适配器转移到OLE DB目标适配器。我们将在稍后的部分查看数据流中的转换。
练习
打开(或创建)第一篇中名叫My_First_SSIS_Project的SSIS项目。
从控制流工具箱中,将数据流任务拖到控制流画布上。
图2.3 数据流任务
数据流任务是一个控制流任务,它也是很重要的。为什么?因为当你打开数据流标签时,你看到的控制流和数据流任务之间有很多相似之处。例如,有一个工具箱。绿色和红色箭头连接器。当你第一次开始使用SSIS时,很容易混淆两者。
右击数据流选择编辑:
图2.4 右击数据流任务
这将打开BIDS中的数据流标签——数据流任务编辑器
图2.5 数据流标签
拖一个OLE DB源适配器到数据流画布
图2.6 添加OLE DB源
当你第一次添加一个OLE DB源到数据流任务,这个组件会显示一个错误图标(带白色X的红圈)。通过查看错误列表可以获得更多关于该错误的信息。为了打开“错误列表”,单击视图下拉菜单,然后单击“错误列表”:
图2.7 获取错误列表
注意你也可以通过快捷键,按住Ctrl的同时按下,然后按下E键显示错误列表。我经常使用这些快捷方式,但这仅仅是一种风格的选择,用你最舒适的方式就行。
SSIS自动验证我们所做的事情。错误列表包含SSIS错误和警告的详细信息。正如你可以看到下面的截图,SSIS发现当前包的两个问题:
图2.8 当前包的错误信息
仔细检查发现一个问题:没有连接管理器分配给OLE DB源。为什么有两个错误?错误2是根源问题。错误1是由错误2引起的。两个错误都是验证错误,错误2表明错误"数据流任务OLE DB源",而错误1表明错误"数据流任务:数据流任务"。OLE DB源(实际还没有分配连接管理器)的问题导致数据流中的验证错误。
让我们来解决它。你可以通过右键单击OLE DB源适配器并选择“编辑…”或双击来打开OLE DB源编辑器。我知道有时双击速度太慢,进入重命名组件的文本编辑模式。当我这样做时,组件看起来像这样:
图2.9 重命名组件
如果我想重合组件这样是非常方便的,但通常我真正想要的是打开编辑器。我的经验是双击图标而不是组件的文本部分,这将打开编辑器:
图2.10 OLE DB源编辑器
如果以前在项目中定义过OLE DB连接管理器,我可以从OLE DB连接管理器下拉列表选择。当前我们没有定义连接管理器。你可以停在这里,回到数据流任务面布下方的连接管理器窗口,然后配置一个新的OLE DB连接管理器。但不要这样做,直接点击OLE DB连接管理器下拉列表右侧的新建按钮。
这实际上只需一个步骤就能创建一个新的OLE DB连接管理器并打开配置OLE DB连接管理器编辑器:
图2.11 新建OLE DB连接管理器
你可以看到在上面的截图中新的连接管理器,同时打开OLE DB连接管理器编辑器。在开发SSIS包时这是一个节省时间的功能,我经常使用它。
当你在服务器上开发SSIS包,你创建连接。连接会存储你的个人资料,将出现在配置OLE DB连接管理器的数据连接列表中。如果这是你创建的第一个SSIS包,你的数据连接列表将是空的:
图2.12 配置OLE DB连接管理器
单击新建按钮创建新的数据连接。早些时候我写的连接管理器处理的事情,如数据库引擎实例和数据库名称。这里就是我们配置这些项目的地方:
图2.13 连接管理器
服务器名称可以键入或选择服务器下拉菜单。一旦服务器名称配置好,SSIS实际上是连接到服务器和检索数据库列表。在“选择或输入一个数据库名称”你可以输入或选择下拉菜单。本例中,我连接到本地5377端口实例,选择AdventureWorks2012数据库。
一旦配置好,可以点击左下角测试连接按钮:
图2.14 测试连接
单击“确定”按钮以关闭“测试”对话框。单击“确定”按钮以关闭“连接管理器”编辑器。点击"确定"按钮关闭配置OLE DB连接管理器窗口。这让你返回OLE DB源编辑器,它现在看起来如下所示:
图2.15 添加连接管理器后的OLE DB源编辑器
注意OLE DB源编辑器下方窗格的警告信息——从列表中选择表或视图。如果选择"表或视图"数据访问模式,但是没有指定具体的表或视图名称。
下一步是:我们如何带入数据?数据访问模式属性配置为OLE DB源适配器带入数据。此处显示的选项:
图2.16 表或视图数据访问模式
表或视图允许你在连接管理器中配置的数据库中选择一个表或视图作为数据源。这是默认选项,如果你选择使用这个选项从源数据库获取数据,你只需从“表或视图的名称”下拉菜单选择表或视图:
图2.17 表或视图的名称
你还可以存储的表或视图的名称到SSIS变量。这提供了一些灵活性,允许动态源表。有一点要记住,在设计时OLE DB源适配器“耦合”到数据流任务。这意味着可以更改表的名称,但不能更改列的名称或其数据类型。There are use cases for utilizing this option, but believing you can write a single data flow to load tables with different schemas is a common misunderstanding.
数据访问模式的另一组设置允许你输入SQL语句查询数据源:
图2.18 SQL命令数据访问模式
SQL命令与变量中的SQL命令提供一种方式,从一个表/视图或联接多表/视图只返回你需要的列。当你选择此选项(推荐使用),“表或视图的名称”替换成SQL命令文本。
图2.19 OLE DB源编辑器
OLE DB源编辑器下方窗格的警告信息——编写SQL查询。
SELECT [BusinessEntityID],[FirstName],[MiddleName],[LastName] FROM [Person].[Person]
代码2.1 编写SQL查询
此时OLE DB源编辑器看起来如下
图2.20 SQL命令形式的OLE DB源编辑器
在你输入第一个SQL命令字符时警告消失
你也可以使用可视化窗口建立一个SQL查询。单击“生成查询”按钮以显示查询生成器:
图2.21 查询生成器
查询生成器提供了一个功能强大且灵活可视界面。
你可以通过单击顶部工具栏“添加表”来添加表格,然后图形定义表之间的关系,然后选择你需要的字段。你可以以图形方式定义标准并指定排序:
图2.22 指定筛选并排序
SQL语句生成并在SQL窗格中显示。如果你在窗格中输入SQL语句,那么图形将依据语句进行更新。正如我以前说过的,这是非常强大和灵活的。
如果你在SSIS项目打开了查询生成器,请单击“取消”按钮关闭它——我们还是用之前键入的SQL命令。在OLE DB源编辑器,单击“列”页。如下图所示,这页显示了在连接管理器页数据访问模式下我们所选择的列信息。
图2.23 OLE DB源编辑器列页
可用外部列展示了数据源的列,在下方网格的外部列则反映出已选择的列,如果我取消MiddleName,编辑器如下所示:
图2.24 取消MiddleName列
我所做的事情是这样的:我已经告诉OLE DB源适配器,当它执行时我想读MiddleName列插入数据流任务,但我不想暴露MiddleName列给任何后续的数据流任务转换或目标。如果我要选择从OLE DB源适配器输出MiddleName列仍然是可用的,但我不能在下游使用它。这是浪费并且SSIS将在执行后提示警告。为什么是浪费?我加载数据,但永远不会使用。因此,一个最佳实践只装载你计划在后续转换和/或目标会使用的SSIS数据到数据流任务。如果我真的不想在数据流任务中包括MiddleName列,我可以简单地在连接管理器页的SQL语句中删除。
我需要使用MiddleName列,所以在下一步前让我们勾选旁边的复选框。
网格中外部列的下拉菜单,只允许我们从可用外部列列表中选择列:
图2.25 选择MiddleName列
网格中的输出列允许设置别名,别名用于数据流任务的后续部分。本例,我将BusinessEntityID列取别名为EntityID:
图2.26 输出列取别名
也可以在SQL命令文本中修改脚本达到上述目的
SELECT [BusinessEntityID] AS EntityID,[FirstName],[MiddleName],[LastName] FROM [Person].[Person]
代码2.2 给列取别名
作为我们的第一个数据流任务中的第一个OLE DB源适配器配置,我们停止其他操作。点击确定按钮关闭OLE DB源编辑器。
拖一个OLE DB目标适配器到数据流任务画布
图2.27 添加OLE DB目标到数据流任务
类似OLE DB源,OLE DB目标也显示一个“连接管理器未配置”错误。我们知道如何解决这个问题,双击OLE DB目标打开编辑器。除此之外,我们得到了这个
图2.28 Microsoft Visual Studio警告
如果我们思考下这个错误。我们配置一个目标组件,但我们却没有提供输入以写到目标。首先,请单击“否”按钮驳回警告对话框。
点击OLE DB源适配器。看到底部的绿色箭头吗?单击并拖动它到OLE DB目标适配器,然后放开鼠标。它会像这样:
图2.29 连接OLE DB源和OLE DB目标
在我们向前走之前让我们把这清理干净。你不会在书本上找到一个像上面的截图,你也不会在博客上找到一张像这样的图片。那么,如何使这个数据流任务的组件看起来更好?首先,选择OLE DB源适配器。然后按住Ctrl键选择OLE DB目标适配器。下一步,单击“格式”下拉菜单,将鼠标悬停在对齐,然后单击居中对齐:
图2.30 居中对齐源和目标
在你点击居中对齐,组件看起来如下所示:
图2.31 对齐后的源和目标
这是更好的。你可以复制到幻灯片上的演示文稿
让我们来看下数据流路径,右击数据流路径选择编辑打开数据流路径编辑器:
图2.32 编辑数据流路径
数据流路径编辑器有个元数据页。它显示连接数据流组件的数据管道的内容:
图2.33 数据流路径编辑器
这里显示的数据流路径元数据看起来类似于表定义。你可以看到列的名称,数据类型,以及若干属性,如长度、精度、小数位数和代码页。这些属性描述通过数据流任务的数据流。数据流沿着这个数据流路径从OLE DB源到OLE DB的目标。
让我们重命名OLE DB目标为Person。双击Person打开OLE DB目标编辑器
图2.34 OLE DB目标编辑器
当OLE DB目标编辑器打开时,OLE DB连接管理器默认选择第一个可用的连接管理器。本例中是127.0.0.1,5377.AdventureWorks2012.sa连接管理器。类似OLE DB源适配器,新建按钮允许你创建一个新的OLE DB连接管理器。我们依旧使用之前的AdventureWorks2012。
数据访问模式默认是“表或视图-快速加载”
图2.35 数据访问模式
最常用的两个选项是“表或视图-快速加载”与“表或视图”。主要的区别是快速加载选项可以执行BULK INSERT语句,而非快速加载选项(“表或视图”)限制于INSERT INTO语句。
如果目标表或视图已经存在,你可以从“表或视图的名称”下拉菜单选择。如果表或视图不存在,你可以使用“表或视图的名称”下拉菜单旁边的“新建…”按钮创建表。这是超级酷,我一直使用它。单击“新建”按钮以创建新的表或视图:
图2.36 创建表
让我们把这个话题拆开。首先,有一个表名,这是从哪里来的?哦,对了,我们将OLE DB目标适配器重命名为Person。在创建表语句中使用该组件的名称是非常聪明的,你不认为吗?我认为是的。列如何?他们来自哪里?哦,对了,还记得数据流路径元数据吗?这些列的数据类型是:DT_I4、DT_WSTR 。这个语句创建列为int和nvarchar(50)。原来DT_I4、DT_WSTR是SQL Server的int、nvarchar数据类型在SSIS中的等效数据类型。这是一个Unicode字符串数据类型。OLE DB目标适配器是足够聪明,识别这些并建立相应的创建表的语句。列长度甚至也是来自数据流路径元数据。
点击确定,当你点击确定后,CREATE TABLE语句将执行并创建表。现在它出现在OLE DB目标编辑器:
图2.37 添加表后的OLE DB目标编辑器
注意底部的警告信息——映射 映射 页上的列。点击映射页查看具体情况:
图2.38 OLE DB目标编辑器映射页
再次,一些非常酷的东西发生在这里。在上图的右上部分包含可用输入列和可用目标列。下面是该部分的一个更好的截图:
图2.39 可用输入列和可用目标列
可用输入列是从数据流路径流向OLE DB目标的列。可用目标列是我们在目标数据库刚创建的Person表中可用的列。因为列名和数据类型都一样,OLE DB目标编辑器自动映射他们。它们是相同的,因为可用的目的列是从可用输入列的元数据中构建的。
点击确定按钮关闭OLE DB目标编辑器。
测试
为了测试我们刚刚建立的SSIS包,单击“启动调试”按钮
图2.40 启动调试
你也可以点击调试->启动调试,或者按F5键:
图2.41 调试->开始调试
注意上图中Package.dtsx[设计]旁边的星号(*)。这说明包自上次保存后已经改变。我们不应该第一次执行调试前保存吗?BIDSD在你每次启动调试时会自动保存包。如果发生了一些不幸的事情(你的笔记本电脑电池耗尽,BIDS卡住等)你的工作仍然保存。
如果你已经仔细地遵循了这个教程,你会看到绿色的窗体:
图2.42 OLE DB源数据转移到OLE DB目标
总结
这是一篇很长的文章。一路上我们讨论了很多的SSIS数据流任务特征。在我看来,数据流任务是掌握学习SSIS时最重要的部分。
在这一篇我们:
->讨论了连接管理器和适配器之间的关系(OLE DB源和OLE DB目标)
->检查连接数据流任务组件的数据流路径的作用和特点,以及“数据流管道”
->了解设计时间验证以及如何查看错误和警告
->研究了适配/编辑器一些很酷的省时特性
->查看数据流画布上的格式化组件
->查看数据流路径元数据
->学习元数据如何通过OLE DB目标建立创建表的语句
下一篇,我们将深入挖掘转换及其应用。