【问题标题】:T-SQL Is it possible to do an Update / Insert with a single fast operationT-SQL 是否可以通过单个快速操作进行更新/插入
【发布时间】:2012-01-05 19:32:43
【问题描述】:

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

执行此类操作的最有效方法是什么?我想先做一个SELECT(可能是EXISTS)来查看是否存在特定的键,然后是UPDATE(如果存在)和INSERT(如果不存在)。您可能还需要为这种语句组合保留UPDLOCKHOLDLOCK,以避免竞争条件。这似乎过于复杂和低效。

我想知道在 SQL Server 2008R2 中是否有更有效的方法来执行此操作。

【问题讨论】:

    标签: sql-server-2008 tsql sql-server-2008-r2


    【解决方案1】:

    SQL Server 2008 和更高版本有一个 MERGE 语句可以做到这一点。

    详情请参阅MSDN Books Online docs on MERGE

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

    • 来源(表或视图或内联 SELECT 语句)
    • 一个目标
    • 一个将两者联系起来的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 进行了高度优化。

    【讨论】:

      猜你喜欢
      • 2021-01-26
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多