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 = 4,5的记录在 Source表存在,但是在 Target表不存在,因此执行的是 INSERT操作。
ID = 6,7的记录在 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;
- sql server
- SQL SERVER
- sql server
- SQL Server
- SQL Server
- SQL SERVER
- SQL Server
- sql server
- sql server
- SQL SERVER
- SQL Server
- SQL SERVER
- SQL Server
- SQL SERVER
- sql server
- sql server
- sql server
- sql server
- OpenCV学习之摄像头录制存储视频
- my_shell.c
- 1159: 最大的两个数(指针专题)
- [WUA APIs]Using the Windows Update Agent API
- HDU6033Add More Zero
- SQL Server
- # MySQL编程基础——自定义函数返回值
- SCU 4444 Travel (完全图 最短路 set )
- 我自己搭建的html表单
- hdu图论题目
- [WUA APIs]AutomatciUpdates
- Java基础的一些总结
- spring cloud学习-什么是Spring Cloud Eureka?
- Ajax解决接受数字成为科学计数法的问题