假设我有一张表,我想插入一行。新行的键可能已经与表中现有行的键匹配,在这种情况下,我想更新现有行。或者,它可能不存在于表中,在这种情况下应该插入新行。
执行此类操作的最有效方法是什么?我想先做一个 SELECT
(也许使用 EXISTS
)查看是否存在特定键,然后是 UPDATE
如果存在和 INSERT
如果不。您可能需要保留一个 UPDLOCK
和一个 HOLDLOCK
对于这种组合语句也是为了避免竞争条件。这似乎过于复杂和低效。
我想知道在 SQL Server 2008R2 中是否有更有效的方法来做到这一点。
最佳答案
SQL Server 2008 和更新版本有一个 MERGE 语句,它正是这样做的。
见 MSDN Books Online docs on MERGE详情。
基本上,你需要四件事:
所以你基本上定义如下:
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 进行了高度优化。
关于sql-server-2008 - T-SQL 是否可以通过单个快速操作进行更新/插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8260305/