加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server-2008 – T-SQL是否可以通过一次快速操作进行更新/插

发布时间:2020-12-12 08:56:50 所属栏目:MsSql教程 来源:网络整理
导读:假设我有一张桌子,我想插入一行.新行的键可能已经匹配表中现有行的键,在这种情况下,我想更新现有行.或者,它可能不存在于表中,在这种情况下应插入新行. 执行此类操作的最有效方法是什么?我想首先做一个SELECT(可能是EXISTS)来查看是否存在特定的键,然后是UPDA
假设我有一张桌子,我想插入一行.新行的键可能已经匹配表中现有行的键,在这种情况下,我想更新现有行.或者,它可能不存在于表中,在这种情况下应插入新行.

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

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读