Sql server 2008 T-SQL是否可以通过单个快速操作执行更新/插入

Sql server 2008 T-SQL是否可以通过单个快速操作执行更新/插入,sql-server-2008,tsql,sql-server-2008-r2,Sql Server 2008,Tsql,Sql Server 2008 R2,假设我有一个表,我想插入一行。新行的键可能已经与表中现有行的键匹配,在这种情况下,我希望更新现有行。或者,它可能不存在于表中,在这种情况下,应插入新行 执行此类操作的最有效方式是什么?我想先做一个选择(可能是存在),看看是否有特定的键,然后是更新(如果有)和插入(如果没有)。您可能需要为这组语句保留一个UPDLOCK和一个HOLDLOCK,以避免竞争条件。这似乎过于复杂和低效 我想知道在SQLServer2008R2中是否有更有效的方法来实现这一点。SQLServer2008和更新版本有一个ME

假设我有一个表,我想插入一行。新行的键可能已经与表中现有行的键匹配,在这种情况下,我希望更新现有行。或者,它可能不存在于表中,在这种情况下,应插入新行

执行此类操作的最有效方式是什么?我想先做一个
选择
(可能是
存在
),看看是否有特定的键,然后是
更新
(如果有)和
插入
(如果没有)。您可能需要为这组语句保留一个
UPDLOCK
和一个
HOLDLOCK
,以避免竞争条件。这似乎过于复杂和低效


我想知道在SQLServer2008R2中是否有更有效的方法来实现这一点。

SQLServer2008和更新版本有一个MERGE语句,它正好可以实现这一点

有关详细信息,请参阅

基本上,你需要四件事:

  • 源代码(表或视图或内联SELECT语句)
  • a目标
  • 连接这两个对象的连接条件
  • 用于存在匹配(源和目标中都存在行)、不匹配(目标中还不存在行)等情况的语句
所以你基本上定义如下:

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高度优化