本篇文章是Integration Services系列的第五篇,详细内容请参考原文


在上一篇你学习了如何将更新从源传送到目标。你同样学习了使用基于集合的更新优化这项功能。
回顾增量加载
记住,在SSIS增量加载有三个使用案例:
1、New rows-add rows to the destination that have been added to the source since the previous load.
2、Updated rows-update rows in the destination that have been updated in the source since the previous load.
3、Deleted rows-remove rows from the destination that have been deleted from the source.
在这篇文章中,我们将关注SSIS增量加载功能中的删除行——自从加载到目标之后在源中被移除的行。
删除缺失的行
让我们建立测试条件。关于这一点的思考,就是让行存在于目标表但不存在于源表。类似从源中插入一行到目标,之后再从源中删除此行。打开SSMS和执行下面的T-SQL语句:

use AdventureWorks2012
go
insert into dbo.Person(FirstName,MiddleName,LastName,EntityID)
values('Andy','Ray','Leonard',99999)

如果执行增量加载删除逻辑就会在源中检测出缺失的行并从目标中删除。此刻我们有一个绝佳的机会测试目标额外一行记录对增量加载逻辑的影响。按下F5键执行SSIS包。检查控制流和数据流任务错误信息。控制流下没有任何错误信息,我的数据流如下所示:

图5.1 数据流任务
这是我所希望的:增量加载运行成功,没有检测到新行或更新行。让我们最后检查下,查找转换操作。点击进度页签搜寻查找转换缓存的记录数:

图5.2 进度中缓存的查找转换记录数
源表(Person.Person)有19972行,查找转换从目标表(dbo.Person)返回19973行,额外的那一行是由查找发现并缓存,但它对于已有的插入和更新数据流逻辑没影响。
在我们往SSIS包中添加新组件前,让我们重命名数据流任务为"Insert and Update Rows"。在控制流画布添加一个数据流任务,并用箭头连接"Apply Staged Updates"执行SQL任务和新数据流任务。重命名数据流任务为"Delete Rows":

图5.3 添加Delete Rows数据流任务
打开Delete Rows数据流任务。添加一个OLE DB源,打开源并配置属性:
->OLE DB连接管理器:127.0.0.1,5377.AdventureWorks2012.sa
->数据访问模式:表或视图
->表或视图的名称:dbo.Person

图5.4 配置OLE DB源
在这个数据流任务中我们使用目标表(dbo.Person)作业源。下一步我们使用一个查找转换来检测行存在于源但没存在于目标(源、目标相对此数据流任务来说)。这和数据流任务中检测新行是完全一样的过程。将一个查找转换拖放到Delete Rows数据流任务,然后连接OLE DB源和查找:

图5.5 添加查找并连接源和查找
打开查找转换编辑器,在常规页面修改指定如何处理无匹配项的行为"将行重定向到无匹配输出":

图5.6 修改无匹配行输出
在连接页面,OLE DB连接管理器选择的是127.0.0.1,5377.AdventureWorks2012.sa。勾选使用SQL查询的结果,并键入如下T-SQL:

select BusinessEntityID As EntityID
from Person.Person

我们只需要EntityID识别列。点击列页将可用输入列的EntityID列拖放到可用查找列的EntityID列:

图5.7 查找转换列映射
因为我们配置查找重定向未匹配的行到无匹配输出。如果在源(dbo.Person)和查找表(Person.Person)有没有匹配的行,这些行会被传送到无匹配输出。点击确定按钮关闭查找转换编辑器。
我们怎样完成删除操作呢?我可以通过添加一个OLE DB命令转换(在更新逻辑中操作过)来实现,但是我敢说,你已经知道接下来要做什么操作的。让我们跳过中间部分,直接在Delete Rows数据流任务添加一个OLE DB目标,然后将查找转换的无匹配输出连接到OLE DB目标:

图5.8 添加OLE DB目标
重名称OLE DB目标为StageDeletes,然后右击打开编辑器。和之前一样,在表或视图的名称下拉列表的旁边,点击新建按键。它应该包含下面的DDL命令:

CREATE TABLE [StageDeletes] (
[EntityID] int,
[FirstName] nvarchar(50),
[LastName] nvarchar(50),
[MiddleName] nvarchar(50)
)

点击确定关闭创建表窗口(此时它会创建StageDeletes表),点击映射页完成OLE DB目标列映射:

图5.9 OLE DB目标列映射
点击确定关闭OLE DB目标编辑器。和之前一样,我们需要在源表(dbo.Person)应用这个deletes集合。在控制流添加一个执行SQL任务,将Delete Rows数据流任务上的绿箭头连接到新的执行SQL任务:

图5.10 添加执行SQL任务组件
打开执行SQL任务编辑器,修改下面属性:
->Name: Apply Staged Deletes
->Connection: 127.0.0.1,5377.AdventureWorks2012.sa
->SQLStatement:

delete dest
from dbo.Person dest
join StageDeletes stage
on stage.EntityID = dest.EntityID

点击确定按钮关闭执行SQL任务编辑器。让我们先单独测试下这个SSIS任务,右击Apply Staged Deletes执行SQL任务然后点击执行任务:

图5.11 单独执行SQL任务
如果我们配置正确它执行成功。停止BIDS调试器。在基于集合更新逻辑中,我们需要处理StageDeletes表。在每次加载到数据流任务之前我们要先清空它,两次加载中记录一直保持以防我们需要查看。没有必要为它再单独创建执行SQL任务。我们已经有一个Truncate任务。点击打开编辑器,在之前的语句下面添加语句:

Truncate Table StageDeletes

输入SQL查询应该如下所示:

图5.12 输入SQL查询
点击确定按钮关闭输入SQL查询窗口,在关闭执行SQL任务之前,修改它的名称属性为Truncate StageUpdates and StageDeletes。点击确定,按F5执行SSIS包:

图5.13 执行成功的控制流画布
看起来不错,查看Delete Rows数据流任务:

图5.14 Delete Rows数据流任务
到此单独的行已经从目标表(dbo.Person)删除。我们可以在SSMS执行下面语句验证:

use AdventureWorks2012
go
select Count(*) As RecCount
from dbo.Person
where FirstName = 'Andy' and LastName = 'Leonard'

返回0,表明记录已经删除。
总结
这篇文章我们做了很多,完善了我们的第一个SSIS包——增量加载。我们学习了一些入门的ETL测试实例,我们学习了查找转换和执行SQL任务。我们设计创建了一个可重复执行的SSIS包,结合增量加载的概念,它可以每月执行一次,将过去一个月的所有变更应用到目标;也可以每5分钟执行一次将这段时间内的变更应用到目标。

第五篇 Integration Services:增量加载-Deleting Rows的更多相关文章

  1. 【译】第五篇 Integration Services:增量加载-Deleting Rows

    本篇文章是Integration Services系列的第五篇,详细内容请参考原文. 在上一篇你学习了如何将更新从源传送到目标.你同样学习了使用基于集合的更新优化这项功能.回顾增量加载记住,在SSIS ...

  2. 第四篇 Integration Services:增量加载-Updating Rows

    本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...

  3. 第三篇 Integration Services:增量加载-Adding Rows

    本篇文章是Integration Services系列的第三篇,详细内容请参考原文. 增量加载是什么增量加载仅加载与先前加载差异的.差异包括:->新增的行->更新的行->删除的行通过 ...

  4. 【译】第四篇 Integration Services:增量加载-Updating Rows

    本篇文章是Integration Services系列的第四篇,详细内容请参考原文. 回顾增量加载记住,在SSIS增量加载有三个使用案例:1.New rows-add rows to the dest ...

  5. 【译】第三篇 Integration Services:增量加载-Adding Rows

    本篇文章是Integration Services系列的第三篇,详细内容请参考原文. 增量加载是什么增量加载仅加载与先前加载差异的.差异包括:->新增的行->更新的行->删除的行通过 ...

  6. 第十五篇 Integration Services:SSIS参数

    本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...

  7. 【译】第十五篇 Integration Services:SSIS参数

    本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...

  8. UITableView个人使用总结【前篇-增量加载】

    UITableView现在边整边总结. 预计分两个部分,第一个部分主要是对UITableView本身属性的学习.第二个部分可能会是加上一个编辑按钮以及对列表的操作. 今天先学习第一部分. 第一部分,我 ...

  9. 第六篇 Integration Services:初级工作流管理

    本篇文章是Integration Services系列的第六篇,详细内容请参考原文. 简介在前几篇文章中,我们关注使用增量加载方式加载数据.在本篇文章,我们将关注使用优先约束管理SSIS控制流中的工作 ...

随机推荐

  1. Grunt教程——初涉Grunt

    前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为庞大和复杂,代码维护.打包.发布等流程也 变得极为繁琐,同时浪费的时间和精力也越来越多,当然人为的错误 ...

  2. Ubuntu 14.04 安装 VirtualBox

    参考: ubuntu14.04,安装VirtualBox 5.0(虚拟机软件)! 由于Vagrant工具的需要,安装了一下VirtualBox. 使用参考链接的法一居然在软件中心里面报错,我想可能是没 ...

  3. MySQL 数据库性能优化之SQL优化

    前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...

  4. Happy

    1.delighted 2.over the moon                   Alex is over the moon with promotion. 3.really pleased ...

  5. NFS文件系统

    一.nfs服务端CentOS6安装nfs-utils和rpcbind两个软件包yum install nfs-utils rpcbind编辑/etc/exports加入:/nfsdir 192.168 ...

  6. php-fpm

    install php-fpm # Ubuntu sudo apt-get install python-software-properties; sudo add-apt-repository pp ...

  7. Siddhi CEP Window机制

    https://docs.wso2.com/display/CEP400/SiddhiQL+Guide+3.0#SiddhiQLGuide3.0-Window https://docs.wso2.co ...

  8. 修改MyEclipse默认的Servlet和jsp代码模板

    一.修改Servlet的默认模板代码 使用MyEclipse创建Servlet时,根据默认的Servlet模板生成的Servlet代码如下: 1 package gacl.servlet.study; ...

  9. php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;

    Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ pr ...

  10. pro8

    1.本次课学到的知识点 函数程序设计 结构化程序设计思想 程序解析 局部变量和全局变量 2.实验过程中遇到的问题及解决方法 实验过程中会遇到自定义函数的逻辑错误 与缺少定义变量 从主函数开始理清函数关 ...