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
目录
相关文章
|
16天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
|
6天前
|
分布式计算 大数据 BI
MaxCompute产品使用合集之MaxCompute项目的数据是否可以被接入到阿里云的Quick BI中
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
4天前
|
SQL 机器学习/深度学习 数据采集
数据分享|SQL Server、Visual Studio、tableau对信贷风险数据ETL分析、数据立方体构建可视化
数据分享|SQL Server、Visual Studio、tableau对信贷风险数据ETL分析、数据立方体构建可视化
16 0
|
5天前
|
SQL Oracle 关系型数据库
利用 SQL 注入提取数据方法总结
利用 SQL 注入提取数据方法总结
|
5天前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之在DataWorks的数据开发模式中,在presql和postsql中支持执行多条SQL语句如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
29 1
|
6天前
|
SQL 机器学习/深度学习 算法
SQL SERVER ANALYSIS SERVICES决策树、聚类、关联规则挖掘分析电商购物网站的用户行为数据
SQL SERVER ANALYSIS SERVICES决策树、聚类、关联规则挖掘分析电商购物网站的用户行为数据
21 2
|
6天前
|
SQL 机器学习/深度学习 数据挖掘
SQL Server Analysis Services数据挖掘聚类分析职业、地区、餐饮消费水平数据
SQL Server Analysis Services数据挖掘聚类分析职业、地区、餐饮消费水平数据
12 0
|
9天前
|
SQL Java 数据库
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
14 1
|
10天前
|
SQL 索引
SQL的数据定义
SQL的数据定义
13 0
|
10天前
|
SQL 数据库
[AIGC] SQL中的数据添加和操作:数据类型介绍
[AIGC] SQL中的数据添加和操作:数据类型介绍

热门文章

最新文章