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

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

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

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

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

最佳答案

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

MSDN Books Online docs on MERGE详情。

基本上,你需要四件事:

  • 来源 (表或 View 或内联 SELECT 语句)
  • 目标
  • 加入 连接两者的条件
  • 用于 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 进行了高度优化。

    关于sql-server-2008 - T-SQL 是否可以通过单个快速操作进行更新/插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8260305/

    相关文章:

    javascript - 如何在asp.net中使用 'onKeyUp'属性?

    sql - 如何从列中获取最小值

    tsql - T-SQL 插入 - 在表变量中选择非常慢

    sql-server - 在 SQL Server 2008 R2 脚本向导中缺少脚本数据

    c# - 将文件名保存到sql数据库并同时运行ssis包

    excel - 使用 Excel 2010 通过存储过程读取/写入 SQL Server 2008 数据库

    sql - 查看以识别分组值或对象

    sql-server - 连接多个 nvarchar 列

    sql - 根据变量类型在 SQL 中进行条件分支

    sql - 对 DATEDIFF 函数的第二个参数的困惑