假设我有一个表,我想插入一行。新行的键可能已经与表中现有行的键匹配,在这种情况下我想更新现有行。或者,它可能不存在于表中,在这种情况下应插入新行。
执行此类操作最有效的方法是什么?我想先做一个SELECT
(也许与EXISTS
) 查看是否存在特定键,后跟UPDATE
如果存在并且INSERT
如果不。您可能需要保留一个UPDLOCK
and a HOLDLOCK
这种语句组合也是为了避免竞争条件。这似乎过于复杂且低效。
我想知道在 SQL Server 2008R2 中是否有更有效的方法来执行此操作。
SQL Server 2008 及更高版本有一个 MERGE 语句来完成此任务。
See the 有关 MERGE 的 MSDN 联机丛书文档 http://msdn.microsoft.com/en-us/library/bb510625.aspx了解详情。
基本上,您需要四件事:
- a source(表或视图或内联 SELECT 语句)
- a target
- a JOIN将两者联系起来的条件
- 用于 MATCH(源和目标中均存在行)、NOT MATCHED(当目标中尚不存在行)等情况的语句
所以你基本上定义如下:
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 进行了高度优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)