SQL Server 2008中的新语句:MERGE

文/李美楠  出处/赛迪网


Microsoft SQL Server 2008将包含用于合并两个行集(rowset)数据的新句法。根据一个源数据表对另一个数据表进行确定性的插入、更新和删除这样复杂的操作,运用新的MERGE语句,开发者只需使用一条命令就可以完成。


在对两个表进行信息同步时,有三步操作必须要进行。首先我们要处理任何需要插入目标数据表的新行。其次是处理需要更新的已存在的行。最后要删除不再使用的旧行。这个过程中需要维护大量重复的逻辑,并可能导致微妙的错误。

值得我们大家主意的是,Bob Beauchemin讨论了MERGE语句,这个语句将上述的多个操作步骤合并成单一语句。以下是他给出的示例:

以下是引用的片断:


merge [target] t
using [source] s on t.id = s.id
when matched then update t.name = s.name, t.age = s.age -- use "rowset1"
when not matched then insert values(id,name,age) -- use "rowset2"
when source not matched then delete; -- use "rowset3"


大家可以看到,具体的操作是根据后面的联合(join)的解析结果来确定的。在这个示例中,假如目标和源数据表有匹配的行,就实行更新操作。如果没有,就实行插入或者删除操作来使目标数据表和源数据表保持一致。


这个新句法的一个精妙之处是它在处理更新时的确定性。在使用标准的UPDATE句法和联合时,可能有超过一个源行跟目标行匹配。在此情况下,无法预料更新操作会采用哪个源行的数据。


而我们在使用MERGE句法时,假如存在多处匹配,它会抛出一个错误。这就需要开发者主意,要达到预想的目标,当前的联合条件还不够十分明确。

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [SQL Server] 的这些文章也感兴趣:

使用SQL Server导入和索引 Microsoft Word 文档
Sql Server 2005 实现Oracle 10g 的hash表分区功能
SQL Server 2008 RTM 发布
SQL Server与Excel数据互导解答
Microsoft RTM版本数据库SQL Server 2008
关于MSSQL占用过多内存的问题
SQL Server 7.0六种数据移动方法
由Sybase向SQL Server移植数据库
SQL SERVER应用问题解答13例(三)
解决SQLServer最大流水号的两个好方法