zoukankan      html  css  js  c++  java
  • SQL Server BI Step by Step SSIS 4 合并数据2

        上次我们并没有实现Excel中的数据与数据库中的数据进行整合,存在即更新,不存在即插入.这次主要介绍几种方法来实现:
         1.使用Lookup
         2.使用execute SQL task调用存储过程
         3.使用script component脚本实现
         4.使用MERGE 语句(SQL SERVER 2008)
         5.使用上次我们用到的Merge来实现
         6.使用第三方组件SCD Component

        看起来能够实现的方法确实不少,我们来一一介绍,介绍的同时也会介绍一些组件的应用,同理在我们实现其它功能时,也可以同样使用.

    1. Lookup

         新建一个包MergeDataLookUp,我们把ForeachInput中的复制过来,我们实现遍历Excel的同时,实现Excel中的数据与数据库中的数据合并,在数据流中,在Excel数据源的下面,删除原来的组件,拖入LookUp组件,选择OLE DB连接后,进行查找的设置: 
           screenshot12

          可以看到,我们是根据Excel数据中的ProductNumber字段去数据库中查找对应的数据(列ProductID),即找到对应的数据时,ProductID会作为新列添加到我们的数据流中,找不到时则会出现错误,点击上面的标出的配置错误输出,

          screenshot12

         这样对于Lookup的两个输出,正常的输出也就是找到了ProductNumber对应的数据,此时做更新操作.上图中我们已经进行了配置,当某一行没有找到时,我们将这行数据重新定行到错误输出,此时再进行插入操作.我们在正常的输出上添加OLE DB Command,来执行我们的Update语句.
         screenshot13
        

       在错误输出上添加我们上次添加过的OLE DB Destination,其中忽略ProductID和rowguid两个字段.整个数据流如下:
       screenshot14

       到现在我们已经实现了利用Lookup合并数据.

    2.使用存储过程
          使用存储过程实现这个就相当容易的多,不过并不建议这样做,我们把所有的流程都放在了存储过程里面,而不是SSIS包里面,有一个应该考虑的是,一般我们可以在SSIS包里设置成支持事务(设置包或者组件的TransactionOption属性).在存储过程里,我们可以直接采用存储过程里面的事务机制.
          我们新建一个包MergeDataProcedure,完成如上个包的设置, 只需要执行一个OLE DB Command,在这里我们调用存储过程,存储过程里我们只是完成根据ProductNumber判断数据存在不存在,存在即执行更新,不存在插入.在这里就不再对这个方法进行详细介绍了.


    3.使用Script Component

         新建一个包MergeDataScript,复制MergeDataLookUp中的控制流和变量,连接器,将Loopup组件换成Script Component组件(添加时使用方法为转换).首先选择输入列,并设置其使用类型:
         screenshot16

        然后设置输入输出,在这里,有一个输入,然后设置三个输出,输出的列不需要手动配置的,是自动创建的,注意到输入RecordsInput的ID为2778.三个输出的名称分别为UpdateRecordsOutput,InsertRecordsOutput,IgnoreRecordsOutput,将输出的属性ExclusionGroup设置成1,将属性SyncronousInputID值设置成RecordsInput(ID为2778),每个输入控件的SyncronousInputID都是不一样的.设置这两个属性是我们下面脚本运行的关键,具体将查询官方文档.
        screenshot17

        最后我们设置一下连接管理器,因为我们在脚本中要获取数据库连接,所以在这里我们添加一个连接的名称,注意这里我并没有连接到原来的OLE DB连接,我在脚本中使用了SqlDataReader,此处需要新建一个ADO.NET连接.
        screenshot18 
        设置完以后,我们再切换到脚本,直接设置脚本,打开脚本编辑器,输入如下脚本,然后关闭.确定.
       

    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 AcquireConnections(ByVal Transaction As Object)
    
            connMgr = Me.Connections.DBConnection
    
            sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
    
        End Sub
        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 RecordsInput_ProcessInputRow(ByVal Row As RecordsInputBuffer)
            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则跳转到更新输出,否则跳转到忽略输出,如果没有找到,则跳转到添加输出.我们也可以直接把添加,更新这些操作放在脚本里面.不过为了使整个流程更加清晰,我们只是使用脚本进行了一个转换.不过其实脚本实现的会更加灵活,这里其实还可以实现双向查找或者是更加复杂的功能.
       我们在Script Component后面添加对应的输出,其中UpdateRecordsOutput,InsertRecordsOutput和使用LookUp一样.不过我们对于IgnoreRecordsOutput输出我们添加一个RowCount进行统计.
       screenshot19

    执行包,完成了数据的更新和添加.

    screenshot20

    好吧,有些困了,今天就只介绍这三种方法的实现,下次再简单的介绍另外三种方法.

    参考文章:

    http://www.mathgv.com/sql2005docs/SSISTransformScriptETL.htm
    http://blogs.conchango.com/jamiethomson/archive/2006/09/12/SSIS_3A00_-Checking-if-a-row-exists-and-if-it-does_2C00_-has-it-changed.aspx
    http://www.sqlis.com/post/Get-all-from-Table-A-that-isnt-in-Table-B.aspx

         本次项目文件下载.(for Vs 2005)

    作者:孤独侠客似水流年
    出处:http://lonely7345.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Android studio初次安装启动时弹出unable to access android sdk add-on list提示的解决方法
    SQL Server(MSSQLSERVER) 请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。
    Docker启动时提示Get Permission Denied while trying to connect解决方法
    Docker版本与centos和ubuntu环境下docker安装介绍
    菜鸟宝典之Windows Server 2012 R2上PHP、MySQL环境搭建
    Java入门指南-04 顺序、分支、循环
    Java入门指南-03 操作符与表达式
    Java入门指南-02 变量
    Java入门指南-01 基本概要说明
    JavaWeb零基础入门-02 开发环境安装
  • 原文地址:https://www.cnblogs.com/lonely7345/p/1397594.html
Copyright © 2011-2022 走看看