用SQL2008的MERGE语句同步表

业务需要同步两表,就研究了一下2008的新功能,感觉还是不错的,怎么说也是系统的功能,同样的作用应该比自己手动做的好。因为我是从没用过到刚会用,所以也只写这部分的心得,再深的请看专家们的BLOG。
现在我们的目标是让T2表与T1表同步,我直接把完整的MERGE语句帖上来,等下再细说各个部分

可以看到T1的东东已经过去了,也就是说初步的同步完成了。
现在做一些其它的操作,我们分别插入、更新、删除一条数据:

现在各种数据都有了,1没变,2删了,3改了,4是加的。再运行上面那坨MERGE语句

可以看到,数据已经完全同步了。看到效果后,我们就可以开始说正文了,我再粘一次MERGE语句,然后一句一句细说
指定要同步的目标表。MERGE是关键字,INTO可有可无,T2是目标表名,AS可有可无,TB_TARGET是表别名。
如果要对目标表加表提示和索引提示,比如WITH(...),加在T2和AS中间就可以了。

指定用来作为同步源的表或其它东东。USING是关键字,T1是原表名或一个子查询,比如一堆JOIN出来的东西用括号括起来。
关联条件,没什么好说的,注意这里开始就用到上面定义的别名了。
这里放到一起说。看到INSERT应该就能猜这段语句的意思是“如果原表有的记录新表没有,就插入”。
NOT MATCHED表示不匹配, BY TARGET表示是新表找不到匹配原表条件(就是上面的ON后写的)的记录, BY TARGET 可以不写,默认就是BY TARGET,但如果要写两个WHEN MATCHED就必须要写,比如上面这个MERGE。
第二三行和普通的插入语句差不多,区别就在于没有目标表名和只能用VALUES不能用SELECT,因为这里都是针对单行的操作。

这个就简单了,如果是原表找不到新表的匹配记录,就把新表的删了。需要注意的就是如果要加上这句,上面的NOT MATCHED必须加BY TARGET。第一行后面的AND部分可以不要,相当于更新的另一个匹配条件,像上面例子中,ID为1的那条数据没有动,但因为能找到匹配记录还是会更新,加上条件就可以避免这种无效操作了。
这行可以都去掉,作用就是输出同步的数据,用过触发器的同学对INSERTED和DELETED两个表应该灰常熟悉,分别放的是更新后的值和更新前的值,看看最后一次MERGE输出的信息就能差不多看出门道了,我就不多说了。如果要调试语句的话,可以加上这句,正常的同步就可以去掉了。最后简单对比一下MERGE和原本同样效果的操作的IO对比

总之,4,5,6,7都是可以去掉的,但4,5,6至少要有一个,这就是MERGE的全部常用语法了。还有一个最后可以加 OPTION查询提示,这个不常用,主要是我不会用,就不说了。
哦对了,MERGE也是可以加TOP的,在第一行的MERGE INTO中间加就行了,不过我觉得比较鸡肋,谁闲着没事就同步一两条的。唯一我能想到的用处就是大数据量同步时分批执行,每次同步N行。

最后简单对比一下MERGE和原本同样效果的操作的IO对比
写的比较长,我是按我的思路写下来的,如果觉得看文字费劲,直接把语句复制出来对着帮助看,也能看个七七八八的。

没有,这是2008的新功能,2005想实现相同的功能需要写存储过程三个语句各跑一遍。

你正常的UPDATE也得有个WHERE吧,把正常的UPDATE条件写到MERGE的ON里就对了,正规的数据库表应该都有个主键的。

比如 有第三方插件的时候 可能会报可疑程序 类似这样的 知道的能把一些可能的情况 罗列下 给我吗 如 开机自启动 可能会被360报什么?添加注册表数据 可能会被报什么?不想参与到了360和tx,金山等的斗争里面去
和腾讯无关吧 我的软件被报错了 被报恶意程序 可疑程序 木马程序

寡人从不用装防火墙,多做备份,有毒先手动杀,不行再先装杀毒软件杀,杀不了还原

软件是公司的哦 但是目前很多客户还是用360的 不能让他们关了360 运行我们软件把 麻烦大家 提提建议 说说他们报错的依据

可以不用360,但是需要有360这样的角色去遏制腾讯什么的垄断

肯定报了,卡巴斯基也是各种报。哪个杀毒软件都报的。

我N年前就开始鄙视360了。
天天报警,烦死了。。后来果断卸载。。
然后一直用瑞星。安静。。
写注册表开机自启动,安装服务,安装内核,一些HOOK,直接写硬盘

要是我的话直接给他做个沙盒,让他扫描的时候是扫的是360自己的进程,然后的情况你知道的

把程序给360,以公司的名义,让他们取消误报。否则,就律师信好了。

来源:nba直播




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值