设为首页 收藏本站
查看: 965|回复: 0

[经验分享] SQL Server BI Step by step 4-2 合并数据 LookUp组件和Script Component组件完成数据合并

[复制链接]

尚未签到

发表于 2015-6-29 14:08:38 | 显示全部楼层 |阅读模式
合并数据2
----LookUp组件和Script Component组件完成数据合并


本章实现Excel中的数据与数据库中的数据进行整合时,存在即更新,不存在即插入.这次主要介绍几种方法来实现:
     1.使用Lookup
     2.使用execute SQL task调用存储过程
     3.使用script component脚本实现
     4.使用MERGE 语句(SQL SERVER 2008)
     5.使用上次我们用到的Merge来实现
     6.使用第三方组件SCD Component
看起来能够实现的方法确实不少,我们来一一介绍,介绍的同时也会介绍一些组件的应用,同理在我们实现其它功能时,也可以同样使用.

一、 LookUp组件
目的:实现遍历多个Excel源的同时,实现Excel中数据和数据库中数据合并,即:存在数据更新,不存在数据插入。
DSC0000.png

  
  
  
  
  
  
  
  
  
  第二次循环,可以测试更新数据哦!同理。
DSC0001.png

2. 新建一个包MergeDataLookUp。
3. 新建一个Foreach循环容器,在里放入数据流任务,进行编辑。按照《Step3  批量导入Excel》配置该循环。注意配置变量和修改Foreach的属性哦!!!
DSC0002.png
4. 切换到数据流tab页,拖一个excel源连接Product1.xls、LookUp组件、OLE DB Command组件、派生列组件、OLE DB目标组件连接Product表用于存储“错误”纪录,并插入该纪录。
DSC0003.png

5. 对LookUp组件设置。
对tab引用表设置:
DSC0004.png
tab列设置:
通过 Excel数据中的ProductNumber字段去数据库中查找对应的数据(查找的纪录行数等于Excel数据源的行数);
选择ProductID为LookUp查询后数据流显示的列。
当找不到对应数据时,点击上面的标出的配置错误输出。
DSC0005.png

对“配置错误输出”设置
DSC0006.png
若不设置,则会报错:
-----------------------------------------------报错---------------------------------------------------------------------------------------
错误: 0xC020901E,位于 数据流任务, 查找 [39]: 在查找期间行没有生成任何匹配项。
错误: 0xC0209029,位于 数据流任务, 查找 [39]: “组件“查找”(39)”失败,错误代码为 0xC020901E,而且针对“输出“查找输出”(41)”的错误行处理设置指定一旦出错就失败。在指定组件的指定对象上出错。
--------------------------------------------------------------------------------------------------------------------------------------------

  6. 对OLE DB Command组件添加Update命令来控制输出。
DSC0007.png DSC0008.png
  
  
UPDATE  Production.Product  SET   [Name]=?,MakeFlag=? WHERE ProductID=?   
  
设置UPDATE列字段与参数的映射。一定要将LookupID对应参数!参数怎么来的呢?呵呵,就是你刚刚Update语句中的参数。
DSC0009.png

  7. 设置派生列组件
DSC00010.png

  8. 设置OLE DB  ,把RroductID、rowguid设置为忽略。Name,ProductNumber映射为派生类的新列。 DSC00011.png

完成,这8个步骤后,加入你关心的数据流查看器,就可以以执行包:
第一次,执行成功!
DSC00012.png

  第二次,运行。
DSC00013.png

  
  数据库中,数据库在第一次运行时,插入两行纪录
DSC00014.png

  细心的朋友,可能会看出两次Lookup后查找到的更新输出、错误输出里的值都没有变化,而第一次执行后数据库的值就已经插入。而正常情况下,更新输出应该是4行了,而错误输出是0行!而整个运行没有错误!
WHY?猜想这个时候用了缓存或是SQL查找后的视图又或者??,而导致没有真正去LOOKUP新数据库而直接读出数据。那这怎么办呢?  问题哦!
  
   二、 使用存储过程
      使用存储过程实现这个就相当容易的多,不过并不建议这样做,我们把所有的流程都放在了存储过程里面,而不是SSIS包里面,有一个应该考虑的是,一般我们可以在SSIS包里设置成支持事务(设置包或者组件的TransactionOption属性).在存储过程里,我们可以直接采用存储过程里面的事务机制.
      我们新建一个包MergeDataProcedure,完成如上包的设置, 只需要执行一个OLE DB Command,在这里我们调用存储过程,存储过程里我们只是完成根据ProductNumber判断数据存在不存在,存在即执行更新,不存在插入.在这里就不再对这个方法进行详细介绍了.
  
  三、 使用Script Component
1. 新建一个包MergeDataScript。
2. 添加控制流和Excel源组件。
3. 添加Script Component组件。
选择脚本控件要使用——转换
DSC00015.png
DSC00016.png

然后设置输 然后设置输入输出。有一个输入,三个输出命名为UpdateRecordsOutput,InsertRecordsOutput,IgnoreRecordsOutput,手动配置。注意到输入RecordsInput的ID为115.将输出的属性ExclusionGroup设置成1,将属性SyncronousInputID值设置成RecordsInput的ID为115。(注意:每个输入控件的SyncronousInputID都是不一样的.设置这两个属性是我们下面脚本运行的关键,具体将查询官方文档)
DSC00017.png
DSC00018.png

  编辑连接管理器。
因为从脚本中要获取数据库连接,这里需要的是SqlDataReader,新建一个ADO.NET连接。
建立ADO.NET连接
   DSC00019.png
  
DSC00020.png

  脚本连接管理器连接到新建的ADO.NET
DSC00021.png
  
  编辑脚本
脚本  Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
  Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Data.SqlClient
  
Public Class ScriptMain
    Inherits UserComponent
      Dim connMgr As IDTSConnectionManager90
      Dim sqlConn As SqlConnection
      Dim sqlCmd As SqlCommand
      Dim sqlParam As SqlParameter
      Public Overrides Sub PreExecute()
        sqlCmd = New SqlCommand("SELECT [Name] FROM Product WHERE ProductNumber=@ProductNumber", sqlConn)
          sqlParam = New SqlParameter("@ProductNumber", SqlDbType.NVarChar, 25)
          sqlCmd.Parameters.Add(sqlParam)
      End Sub
      Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
          connMgr = Me.Connections.DBConnection
          sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
      End Sub
  
    Public Overrides Sub 输入0_ProcessInputRow(ByVal Row As 输入0Buffer)
        Dim reader As SqlDataReader
        sqlCmd.Parameters("@ProductNumber").Value = Row.ProductNumber
          reader = sqlCmd.ExecuteReader()
        If reader.Read() Then
            '此处可以根据需要进行字段的比较           
            If (reader("Name").ToString()  Row.Name) Then
                Row.DirectRowToUpdateRecordsOutput()
            Else
                  Row.DirectRowToIgnoreRecordsOutput()
              End If
          Else
            Row.DirectRowToInsertRecordsOutput()
        End If
          reader.Close()
    End Sub
    Public Overrides Sub ReleaseConnections()
        connMgr.ReleaseConnection(sqlConn)
    End Sub
  
End Class

  上面的脚本的具体含义也就不再详细介绍,比较容易理解,其实与我们使用LookUp实现的功能相同.使用ProductNumber进行查找Name字段,如果找到Name则跳转到更新输出,否则跳转到忽略输出,如果没有找到,则跳转到添加输出.我们也可以直接把添加,更新这些操作放在脚本里面.不过为了使整个流程更加清晰,我们只是使用脚本进行了一个转换.不过其实脚本实现的会更加灵活,这里其实还可以实现双向查找或者是更加复杂的功能.
  
  4. 在ScriptComponent设置了三个输出,UpdateRecordsOutput对应OLE DBCommand组件,InsertRecordsOutput对应OLE DB目标组件,IgnoreRecordsOutput对应行计数组件
  
  5. 设置OLE DBCommand组件。

  • 连接管理器设置为原来OLE DB管理器
  • 设置Command   UPDATE Production.Product  SET   [Name]=?  WHERE ProductNumber=?


  •  列映射
  • DSC00022.png
  6. 设置OLE DB目标组件,对应原来OLE DB管理器,指向Product表。
(UpdateRecordsOutput,InsertRecordsOutput和使用LookUp一样)

  7. 设置行计数组件。

  • 添加变量,作用域就是该数据流任务
  • DSC00023.png
  在行计数组件的属性中,找到VariableName设置为刚刚变量——用户::RowIgnore。
DSC00024.png
  执行:我的问题就是,输出显示成功,但是数据流没有数据。

  
  
  项目step1---4源代码文件:版本为SQL 2005,运行代码前还需要安装ExceL应用程序
  /Files/cocole/Step1-4Sql05.rar
  
  
  作者:悟空的天空(天马行空)
出处:http://www.iyunv.com/cocole/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81534-1-1.html 上篇帖子: 《SQL Server 2008 管理实战》 下篇帖子: 《Microsoft SQL Server 2008 Analysis Services Step by Step》学习笔记十九:监视和管理工具进阶(本书完)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表