SQL Server BI Step by Step SSIS 4 ---合并数据2

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

 上次我们并没有实现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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


标签: Lookup, Execute SQL task, Script Component, 重新定行, 配置错误输出, Row Count, SSIS 脚本


本文转自孤独侠客博客园博客,原文链接:http://www.cnblogs.com/lonely7345/archive/2009/02/24/1397594.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
4天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
23天前
|
SQL 存储 关系型数据库
一文搞懂SQL优化——如何高效添加数据
**SQL优化关键点:** 1. **批量插入**提高效率,一次性建议不超过500条。 2. **手动事务**减少开销,多条插入语句用一个事务。 3. **主键顺序插入**避免页分裂,提升性能。 4. **使用`LOAD DATA INFILE`**大批量导入快速。 5. **避免主键乱序**,减少不必要的磁盘操作。 6. **选择合适主键类型**,避免UUID或长主键导致的性能问题。 7. **避免主键修改**,保持索引稳定。 这些技巧能优化数据库操作,提升系统性能。
219 4
一文搞懂SQL优化——如何高效添加数据
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
【MySQL进阶之路丨第十四篇】一文带你精通MySQL重复数据及SQL注入
47 0
|
1月前
|
SQL 数据可视化 数据处理
使用SQL和Python处理Excel文件数据
使用SQL和Python处理Excel文件数据
54 0
|
4天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
4天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
4天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
4天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。
|
26天前
|
SQL 关系型数据库 MySQL
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
SQL INSERT INTO order_record SELECT * FROM 从一张表查出数据插入到另一张表
14 0
|
1月前
|
SQL 安全 数据库
第三章用sql语句操作数据
第三章用sql语句操作数据
10 0

热门文章

最新文章