这些包可以独立使用,也可以与其他包一起使用以满足复杂的业务需求。integration services 可以提取和转换来自多种源(如 xml 数据文件、平面文件和关系数据源)的数据,然后将这些数据加载到一个或多个目标。(摘自msdn,更多详细信息可参考:)
下面我使用ssis来演示一个实际例子。比如我有一个数据库,出于备份数据或者其它的目的,会定期的对这个数据库的数据迁移到其它的数据库去。迁移的时候,有些新增的字段会被插入备份数据库,而有些被修改过的字段也会在备份数据库被修改。现在我们就用ssis来完成这项任务。
首先在我源数据库db_source和目标数据库db_destination中运行以下sql创建好需要的表,就以这一个表test_1来进行示范。
复制代码 代码如下:
create table [dbo].[test_1](
[id] [int] identity(1,1) not null primary key,
[name] [varchar](50) null,
[age] [int] null
)
建好表好在源数据表中可以随便加几条记录,目标数据库暂时留空。
现在我们打开vs,创建一个intergration services project。(注意:如果sql server 装的是express版的话是没有这个项目工程模板的)
创建好工程后,在control flow这个tab下拖入一个data flow task,如下图:
双击这个data flow task,我们就会进入data flow这个tab标签中。
然后我们在左边工具栏里找到ole db source,继续拖两个ole db source出来。分别给它们命名为source db和destination db。
将数据源拖出来后,双击它,可以对它进行一些设置,主要就是链接数据库及选择你要进行迁移的表或者视图等设置,这里我就不详细说明了。注意一点的是就像上图所示,如果一个图形上出现一个红x的话说明设置有错误。
再来就是拖两个sort及一个merge join出来,将之前的数据源箭头分别指向两个sort,最后两个sort出来的数据同时输入merge join中。
分别双击两个sort,钩选表中的id,对id这个字段进行一次排序。因为merge join这个流程要求输入的数据是已排序好的。这个排序也可以直接在数据源中对它们的输出字段设置sortkeyposition这个属性来排序。(详见:)
这里我们第一次从sort拉箭头到merge join的时候,会让我们选择这个输入的数据是作为左输入还是右输入,我们按照图示的那样,左边的作为左输入,右边的作为右输入。然后我们双击merge join,按照如下图所示设置:
这里打钩的是这个流程之后输出的数据,join type需要选择为left outer join,因为左边是我们的原始数据表,右边是我们备份的表,右表可以看成是一个左表的一个子集,如果左表有的数据,右表没有的,那些就是需要新插入备份数据库的数据。
现在我们需要一个分支,即新的数据需要插入备份数据库中,而已有的数据需要更新为新的值。我们从工具栏中拖入一个conditional split来进行这样的分支处理。我们将merge sort中的输出指向conditional split,然后双击conditional split,如下图所示设置(注意条件一个是isnull,一个是非isnull)。
这时它们的输入值就被分成两种条件输出,最后我们再拖入一个ole db destination来插入数据和一个ole db command来更新数据库,最终流程如下图:
双击设置ole db destionation,选择好数据导入的目标数据库中的表,这里需要注意的就是要钩选keep identity这个选项,因为我创建表的时候对id字段使用了自增属性。
双击设置ole db command,首先在connection managers这个tab中选择好链接对象,然后在component properties这个选项卡中,设置你的sqlcommand属性。如下图:
这里的参数值都是用?号来代替,之后在column mappings这个tab中设置代替值实际代替的列,如下图:
至此,任务就创建完毕了,没有编写任何代码,直接拖拉完成了。现在可以直接在vs中按f5运行看下效果,我们的目标数据表将插入源数据表中的值。然后我们修改一下原数据表,再来运行一下上面这个任务,就可以在目标数据库中看到更改了。
那么如何去定时完成任务哩?这里可以用sql server agent去调用上面我们写好的包, 或者在windows计划任务中使用dtexec.exe去执行上面的任务。