SQL Server 2008 引入了一个称为MERGE 的语句,它能在一条语句中根据逻辑条件对数据进行不同的修改操作(INSERT、UPDATE和DELETE)。MERGE语句是SQL 标准的一部分,而T-SQL版本的MERGE语句也增加了一些非标准的扩展。
因为MERGE语句是新增的,所以必须使用SQL Server 2008。
使用MERGE语句的好处是:用较少的代码就可以表达需求,提高查询性能,因为它可以更少地访问查询涉及表。
MERGE INTO dbo.Customers AS TGT
USING dbo.CustomersStage AS SRC
ON TGT.custid=SRC.custid
WHEN MATCHED THEN
UPDATE SET
TGT.companyname=SRC.companyname,
TGT.phone=SRC.address,
TGT.address=SRC.address
WHEN NOT MATCHED THEN
INSERT (custid,companyname,phone,address)
VALuES( SRC.custid,SRC.companyname,SRC.phone,SRC.address);
注意:MERGE 语句必须以分号结束,而对于T-SQL中的大多数其他语句来说,以分号结束语句是可选的。但是,如果遵循最佳实践,用分号结束所有语句,这也并不会带来什么麻烦。
当存在匹配时,该MERGE 语句定义了一个UPDATE 操作,将目标表的companyname、phone及address设置为来源表中相应行的同名列值。注意,此处UPDATE操作的语法和普通的UPDATE语句很类似,只是不须要再提供更新操作的目标表,因为在MERGE子句中已经定义好了目标表。
当不存在匹配时,该MERGE语句定义了一个INSERT操作,将来源表中的数据行插入目标表。同样,此处INSERT操作的语法和普通的INSERT语句很类似,只是不须要再提供插入操作的目标表,因为在MERGE子句中已经定义好了目标表。
T-SQL 还支持第3种子句WHEN NOT MATCHED BY SOURCE,它用于定义对于目标表的一个行,在来源表中没有与之匹配的行时应该采取的操作。
原文:http://www.cnblogs.com/zhangdx/p/3758118.html