SQL Server

来源:互联网 发布:淘宝新店旺旺提取神器 编辑:程序博客网 时间:2024/06/09 04:49


   表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE等。包括在 SSIS Package中也可以通过 Lookup, Condition Split等多种 Task的组合来实现表数据之间的同步。在这里 "同步"的意思是指每次执行一段代码的时候能够确保 A表的数据和 B表的数据始终相同。

 

可以通过 SQL Server中提供的 Merge语句来实现,并且还可以将操作的细节记录下来。具体的细节内容请参照 -http://msdn.microsoft.com/zh-cn/library/bb510625.aspx 我这里只用一个简单的示例来介绍一些它的常见功能。

 

测试表 -一个 Source表,一个 Target表和一个日志记录表,用来记录每次所执行的操作。

 

下面是主要的同步操作

 

MERGEINTO -数据的目的地,将数据最终 MERGE到的表对象

 

USING与源表连接 ON关联的条件

 

WHEN MATCHED-如果匹配成功,即关联条件成功 (这时就应该将 SOURCE中其它的所有字段值更新到 TARGET表中)

 

WHENNOTMATCHED BY TARGET -如果匹配不成功 (TARGET中没有这一条记录但是 SOURCE表有,说明 SOURCE表多了新数据因此应该插入到 TARGET表中)

 

WHENNOTMATCHED BY SOURCE -如果匹配不成功 (SOURCE中没有这一条记录但是 TARGET表有,说明 SOURCE表可能把这条数据删除了,所以 TARGET也应该删除)

 

代码:

MERGEINTO @TargetTable AS T          

USING@SourceTable AS S               

  ON T.ID = S.ID                     

WHENMATCHED        

  THENUPDATE SET T.DSPT = S.DSPT 

WHEN NOTMATCHED BY TARGET  

  THEN INSERT VALUES(S.ID,S.DSPT)

WHEN NOTMATCHED BY SOURCE           

  THEN DELETE

OUTPUT$ACTION AS [ACTION],

  Deleted.ID AS 'Deleted ID',

  Deleted.DSPT AS 'Deleted Description',

  Inserted.ID AS 'Inserted ID',

  Inserted.DSPT AS 'Inserted Description'

INTO@Log;

 

 

还要注意的是有一些限制条件:

•在 Merge Matched操作中,只能允许执行 UPDATE或者 DELETE语句。

•在 Merge Not Matched操作中,只允许执行 INSERT语句。

•一个 Merge语句中出现的 Matched操作,只能出现一次 UPDATE或者 DELETE语句,否则就会出现下面的错误 - An action of type 'WHENMATCHED' cannot appear more than once in a 'UPDATE' clause of a MERGEstatement.

Merge语句最后必须包含分号,以 ;结束。

 

执行一下上面的 MERGE语句查看一下结果,两个表的数据一模一样了 -

 

ID =1,2,3的记录在 Source表和Target表都存在,因此执行的是 UPDATE操作。

 

ID = 45的记录在 Source表存在,但是在 Target表不存在,因此执行的是 INSERT操作。

 

ID = 67的记录在 Target表存在,但是在 Source表不存在,因此执行的是 DELETE操作。


以上转自http://www.cnblogs.com/biwork/p/3370335.html

下面这个是本人在一个sql server与Oracle转换中的实际例子

CREATE OR REPLACE PROCEDURE "DHS"."PR_CT_PLA_PALASMAMEMBERDATA" (mFcontrolunitid varchar2)  is
begin
  merge into  ct_bas_communicator L using(select * from ct_bas_communicator@easlink where fcontrolunitid=mfcontrolunitid) R
        ON (L.fid=r.fid)
        when not matched then
          insert values (r.fnumber, r.fsimplename, r.fid, r.fcreatorid, r.fcreatetime, r.flastupdateuserid,
                        r.flastupdatetime, r.fcontrolunitid, r.cfstorageorgunitid, r.cfpersonsex, r.cfpersonbirthday,
                        r.cfmobilephonenum,r.cfmobilephonenumbackup, r.cfaddress, r.cfworkphonenum, r.cfhomephonenum,
                        r.cfemail,r.cfemailbackup,r.fname_l1,r.fname_l2,r.fname_l3,r.fdescription_l1,r.fdescription_l2,
                        r.fdescription_l3, r.cfsalesmenid)
        when matched then
              update set l.fnumber=r.fnumber, l.fsimplename=r.fsimplename, l.fcreatorid=r.fcreatorid,
                    l.fcreatetime=r.fcreatetime, l.flastupdateuserid=r.flastupdateuserid,
                    l.flastupdatetime=r.flastupdatetime,l.fcontrolunitid=r.fcontrolunitid,
                    l.cfstorageorgunitid=r.cfstorageorgunitid,l.cfpersonsex=r.cfpersonsex,
                    l.cfpersonbirthday=r.cfpersonbirthday,l.cfmobilephonenum=r.cfmobilephonenum,
                    l.cfmobilephonenumbackup=r.cfmobilephonenumbackup,l.cfaddress=r.cfaddress,
                    l.cfworkphonenum=r.cfworkphonenum,l.cfhomephonenum=r.cfhomephonenum,
                    l.cfemail=r.cfemail,l.cfemailbackup=r.cfemailbackup,l.fname_l1=r.fname_l1,
                    l.fname_l2=r.fname_l2,l.fname_l3=r.fname_l3,l.fdescription_l1=r.fdescription_l1,
                    l.fdescription_l2=r.fdescription_l2,l.fdescription_l3=r.fdescription_l3,
                    l.cfsalesmenid=r.cfsalesmenid
                    where to_char(l.flastupdatetime,'yyyy-mm-dd hh24:mi:ss')<to_char(r.flastupdatetime,'yyyy-mm-dd hh24:mi:ss');
                    commit;

end pr_CT_PLA_PALASMAMEMBERDATA;




原创粉丝点击