incremental data load

--prepare table
IF EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'dbo.MyTest')
                    AND type IN ( N'U' ) )
    DROP TABLE dbo.MyTest
GO

CREATE TABLE dbo.MyTest
    (
      myKey INT NOT NULL ,
      myValue INT NULL ,
      myValueText VARCHAR(10) NULL ,
      hash AS ( hashbytes('SHA1', ISNULL(CONVERT(VARCHAR(MAX), MyValue, 0),'') + ISNULL(CONVERT(VARCHAR(MAX), myValueText, 0),'')) ) ,
      CONSTRAINT PK_MyTest PRIMARY KEY CLUSTERED ( myKey ASC )
    )

IF EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'dbo.MyTestSource')
                    AND type IN ( N'U' ) )
    DROP TABLE dbo.MyTestSource
GO

CREATE TABLE dbo.MyTestSource
    (
      myKey INT NOT NULL ,
      myValue INT NULL ,
      myValueText VARCHAR(10) NULL,
    )

GO

--prepare data
INSERT INTO dbo.MyTestSource(myKey, myValue, myValueText)
SELECT 1, 1, 'A' UNION ALL
SELECT 2, -2, '-B' UNION ALL    --data changed
--SELECT 3, 3 UNION ALL         --data removed
SELECT 4, 4, 'D'                --data added


INSERT INTO dbo.MyTest(myKey, myValue, myValueText)
SELECT 1, 1, 'A' UNION ALL
SELECT 2, 2, 'B' UNION ALL
SELECT 3, 3, 'C'

--check data
SELECT * FROM MyTestSource;
SELECT * FROM MyTest;
------------------------------------------------------------
--increamental sych data, delete, update and then append
------------------------------------------------------------
--delete
DELETE  MT
FROM    MyTest AS MT
WHERE   myKey NOT IN ( SELECT   myKey
                       FROM     MyTestSource AS MTS ) ;

--update
UPDATE  MT
SET     MT.MyValue = MTS.MyValue ,
        MT.MyValueText = MTS.MyValueText
FROM    MyTest AS MT
        INNER JOIN MyTestSource AS MTS ON MT.myKey = MTS.myKey
                                          AND MT.hash <> ( hashbytes('SHA1', ISNULL(CONVERT(VARCHAR(MAX), MTS.MyValue, 0),'') + ISNULL(CONVERT(VARCHAR(MAX), MTS.myValueText, 0),'')) ) ;
--append          
INSERT  INTO MyTest
        ( myKey ,
          myValue ,
          myValueText
        )
        SELECT  myKey ,
                myValue ,
                myValueText
        FROM    MyTestSource
        WHERE   myKey IN ( SELECT   myKey
                           FROM     MyTestSource AS MTS
                           EXCEPT
                           SELECT   myKey
                           FROM     MyTest AS MT ) ;
                                   
--check the reulst
SELECT * FROM MyTest;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29351/viewspace-669722/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29351/viewspace-669722/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值