[SSIS]增量抽取解决方案

因为一个客户近期要用SSIS增量抽取,上一次搞已经是几年前的事情了,于是操起SSIS重撸一遍并给予记录。

我记得以前做的时候整的那个流程眼花缭乱、各种姿势,维护起来有些呕吐,这次粗暴直接一点,要达到傻逼都能轻易维护的效果。

 

首先,思路是采用时间戳的方式做增量,于是建一个log表用来记录时间戳。如下:

源表和目标表的创建我就略了,创建SSIS方案我也略了。

说一下第一个用于增量加载的表的抽取逻辑。

  • 首先在package中建立两个变量:StartTime、EndTime,这两个变量的作用在操作过程中予以体现。

 

第一步,新建执行SQL任务组件。我起名Init variable,顾名思义。它的配置如下:

SQL如下,大意是如果log表中存在某包的抽取记录,就把它的上次抽取成功的时间查出来,然后再赋予这次截止的时间,如果不存在就是第一次抽取,给个足够小的时间+本次截止时间,over~

if exists(select * from ETLLOG where PackageName='SOURCE')
    SELECT LastSuccessTime AS StartTime, (select cast(convert(varchar(10),getdate(),120)+' 00:00:00' as datetime)) AS EndTime FROM ETLLOG WHERE PackageName='SOURCE'
else
    SELECT (select cast('1900-1-1 00:00:00' as datetime)) AS StartTime, (select cast(convert(varchar(10),getdate(),120)+' 00:00:00' as datetime)) AS EndTime

查出来了就是这次要抽取的时间间隔,赋予StartTime和EndTime,我觉得已经够粗暴直接了。

整个流程放一下:

第一步完。

 

第二步:PreClear,我的想法是不管上次成功没成功,我都要在目标表中清空该时间区间的数据(因为这个项目有些特殊,数据是日志数据,所以没有更新或删除,此类情况拓展一下就OK了)

脚本如下:

DELETE 
FROM TARGET 
WHERE   (CreationTime > ?) AND (CreationTime <= ?)

参数映射如下:

第二步完。

 

第三步:就是源到目标表的映射了。

源的SQL:

SELECT   C1, C2, CreationTime
FROM      SOURCE
WHERE   (CreationTime > ?) AND (CreationTime <= ?)

目标表没啥说的,选一下目标表即可。

 

第四步:插入log表

if exists(select * from ETLLOG where PackageName='SOURCE')
    update ETLLOG set PreSuccessTime=LastSuccessTime, LastSuccessTime=?
        where PackageName='SOURCE'
else
    insert into ETLLOG select 'SOURCE',NULL,?

 

说点部署相关的,这次直接在方案上做部署。

1、需要SQL Server上Integration目录下创建目录,打开VS进行部署的时候在SSISDB下再创建一个文件夹,部署就行了。

2、关于SSIS项目的安全,项目和包的ProtectionLevel都搞成DontSaveSensitive。

3、然后部署到Job即可。

 

关于一些其他方面邮件、异常、服务账户等问题,就是另外的话题了。

posted on 2017-12-19 15:24  与数共舞  阅读(609)  评论(0编辑  收藏  举报

导航