2011-11-24 50 views
6

假设我有一个表,并且想要插入一行。新行的键可能已经匹配表中现有的行键,在这种情况下,我想更新现有的行。或者,它可能不存在于表中,在这种情况下应该插入新行。T-SQL是否可以使用单个快速操作进行更新/插入

执行此类操作的最有效方法是什么?我正在考虑首先执行SELECT(可能与EXISTS)以查看是否存在特定密钥,如果存在UPDATE,并且如果不存在则为INSERT。您可能需要保留一个UPDLOCK和一个HOLDLOCK这个组合的语句,以避免竞争条件。这似乎过于复杂和低效。

我想知道在SQL Server 2008R2中是否有更高效的方法来做到这一点。

回答

10

SQL Server 2008和更高版本有一个MERGE语句正是这样做的。

查看MSDN Books Online docs on MERGE了解详情。

基本上,你需要四样东西:

  • 一个(表或视图或内嵌SELECT语句)
  • 一个目标
  • 一个JOIN条件,这两个
  • 链接
  • 用于存在MATCH(源和目标中都存在行)的情况下的语句,NOT MATCHED(当行不存在于tar尚未获得)等

所以你基本上定义是这样的:

MERGE (targettable) AS t 
USING (sourcetable) AS s 
ON (JOIN condition between s and t) 
WHEN MATCHED THEN 
    UPDATE SET t.Col1 = s.Col1, t.Col2 = s.Col2 (etc.) 
WHEN NOT MATCHED THEN 
    INSERT(Col1, Col2, ..., ColN) VALUES(s.Col1, s.Col2, ......, s.ColN) 

这是作为一个语句来完成,并通过SQL Server的高度优化。

+0

非常好的答案,+1和接受... –

相关问题