现在的位置: 首页 > 综合 > 正文

SQL Server BI Step by step 4-3 合并数据 Conditional Split和Slowly Changing Dimension组件

2012年07月01日 ⁄ 综合 ⁄ 共 2413字 ⁄ 字号 评论关闭

合并数据3-----------Conditional Split和Slowly Changing Dimension组件

以ProductNumber查找Excel和数据库。当数据在Excel中但没在数据库的就新增;都在的就更新;数据库中有数据但Excel中没数据的就删除。
不再数据库中的就删除。

一、 Conditional Split组件
如果用Product表来试验,Add时会遇到很大的麻烦:因为完全联接时,会造成某条纪录会有多个NULL值,而数据库中又要求不能为空!这样就Add不进去!所以我只有从新做一套数据来试验咯~5555~费了我不少时间啊

 

1. 准备Excel数据源,它的数据完全来自于现在的数据库,一共有9行数据。
    但是对其中ID为1,2的ProductNumber数据进行新的修改,用于Add.
    ID为3,4的ProductNumber纪录在数据存在,但是MakeFlag属性有更改,用于Update.
    而数据表,我们把表中ProductNumber值改为一个Excel表中没有的,为了Delet时计数等于1.现在删除后有7行数据。

2. 新建MergeDataMerge 包。
3. 拖一个OLE DB 源和Excel源。OLE DB 源连接到Product表,Excel源来连接到指向Product1.xls。
4. 拖入两个Sort组件,分别按ProductNumber字段进行升序排序。
5. 添加合并联接组件。
 
ProductNumber指OLE DB的字段。NewProductNumbe指Excel的字段
这里我们选的是完全外部连接,这样才能完全合并两边的数据.当一方数据没有匹配的数据时,用NULL代替.所以我们直接根据合并后的ProductNumber和NewProductNumber 就可以直接判断出这行数据应该是添加,更新,还是删除.在Merge Join组件下面,我们添加Conditional Split组件,这个组件来判断对于不同的情况的分支

6. Conditional Split组件
 
很简单,当行中对应的ProductNumber为NULL时,说明没有从数据库时面查到匹配的数据,所以这条数据应该进行新增操作,当NewProductNumber为NULL时,说明Excel数据源中不存在数据库中ProductNumber对应的数据,所以此条数据应该进行删除,最后,如果两个ProductNumber相同,则应该进行更新操作.这里需要注意的是,一定要把两个判断ISNULL的条件放在前面,因为我们在第三个里面用到了TRIM,如果为NULL值时,会有错误发生.

 

我没有完成update的任务,也查不出来,后面看吧
解决:

7. 配置OLE DB  Destination和OLE DB   Command。
OLE DB   Command的Update语句

脚本

UPDATE [dbo].[Product_Teste] SET [MakeFlag] = ?,[Name] = ? WHERE [ProductNumber] = ?

配置列的映射:
 
这里一定要注意咯!输入列的顺序与UPDATE语句中参数顺序是要一直的!否则,将会报错。
运行:
 

没有派生列时,的错误
 

运行:

 
 

 

 
 
 

 合并后的数据库
 
原来的DB
 

二、 同样的需求目的用Slowly Changing Dimension组件完成。
1. 准备数据源,如上。只是DB数据有最后一条有改变。新建包:MergeDataSCDComponent.dtsx
 

2. 添加Slowly Changing Dimension组件
双击这个控件进行设置,我们会发现,这类似于一个安装程序,可以一步一步的设置,点击下一步,首先我们需要选择数据连接管理器,然后再设置业务键,在这里我们设置ProductNumber列作为业务键
 

再点击下一步,在这里我们可以选择数据源中的列,然后设置此列的更改类型,分为固定,变化还是历史,在左面已经列中不同的类型的详细说明:
 
可以看到这个组件很强大,可以针对不同的更改类型做出这么多的区分,我们再点击下一步,看到在这里可以设置,如果固定类型的属性更改时是否转换失败,变化的属性更改时,是否更改所有的匹配记录.
 
我们直接下一步,然后完成整个配置,可以看到,Slowly Changing Dimension下面多出来了三个分支和其对应的组件,就象我们前几次实现的一样,只不过这次是全部配置完成的.虽然下面的其中的两个组件名显示的是英文(估计是没有对应的中文翻译),不过还是相应强大的.


 

我们来看一下这三个自动生成的组件。“插入目标”,它自动生成的是一个OLE DB目标组件,并自动把字段映射好了,而且对于一些特殊的列已经自动进行了忽略(考虑的还真周到).
其它的两个更新的操作,都是生成的OLE DB Command组件,而且自动生成了SQL语句。它们完成的目的就是更新数据

脚本

UPDATE [dbo].[Product_Teste] SET [MakeFlag] = ?,[Name] = ? WHERE [ProductNumber] = ?

 
运行:
 

 数据库:
 

 

三、 总结
用了两个组件完成了在一个数据流中新增、更新、删除(只有Condition Split组件可以)的操作。
用下来感觉第一比较复杂,都是需要手动来配置。但是很灵活你可以根据你的需求对不同操作进行控制。
而第二个都是自动生成,降低了使用的难度,但是就不太灵活了。

 

 

项目step1---4源代码文件:版本为SQL 2005,运行代码前还需要安装ExceL应用程序

/Files/cocole/Step1-4Sql05.rar

 

作者:悟空的天空(天马行空)
出处:http://www.cnblogs.com/cocole/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

 

抱歉!评论已关闭.