添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

更新tab1设置col1=col2,col2=col1

1 人关注

这个查询如何交换tab1的col1和col2的数据? 基本上,为了交换我们需要临时变量,但这里我们没有。

sql
sql-server-2008
Jeevan Bhatt
Jeevan Bhatt
发布于 2010-10-27
2 个回答
Quassnoi
Quassnoi
发布于 2010-10-27
已采纳
0 人赞同

就是这样。

UPDATE  tabl
SET     col1 = col2,
        col2 = col1

没有DML查询看到其结果,以避免万圣节问题

在内部,UPDATE锁被放在记录(或数据页)上,旧值被读取并存储到临时变量中,然后锁被提升为EXCLUSIVE,新值(存储在临时变量中)被写入适当的列。

只是出于兴趣,你知道即使隔离级别设置为 "未提交"(Read Uncommitted),这是否也能工作?
@Paul:是的,确实如此。尽管有 READ UNCOMMITED ,但 DML 查询会放置锁。
onedaywhen
onedaywhen
发布于 2010-10-27
0 人赞同

我的笔记归功于乔-塞尔科。

<set clause list> 中的每个赋值都是并行执行的,每个SET子句都会一次性改变所有符合条件的行。 每个SET子句都会一次改变所有符合条件的行。 或者至少 这是理论上的模型。 在实践中,实现会首先 使用WHERE子句一次性标记表中的所有合格行。 子句。 如果没有问题,那么SQL引擎就会在工作存储器中为每条被标记的行制作一个副本。 每个被标记的行在工作存储器中的副本。 每个SET子句的执行都是基于 每一个SET子句都是根据旧的行图像来执行的,结果被放到新的行图像中。 最后,旧行被删除,新行被插入。 如果在这些过程中出现 如果在这些过程中发生了错误,那么系统会进行ROLLBACK,表会保持不变,并且错误会被删除。 不变,并报告错误。 这种并行性与 与你在传统的第三代编程语言中发现的不同。 语言,所以可能很难学习。 这个功能可以让你写一个 语句来交换两列中的值,因此。

UPDATE MyTable
SET a = b, b = a;
BEGIN ATOMIC
UPDATE MyTable
SET a = b;
UPDATE MyTable
SET b = a;
END;

在第一个UPDATE中,a列和b列将在每一行交换数值。 在 第二对UPDATE中,a列将获得每行中b列的所有值 列b在每一行的值。 在第二对UPDATE中,a,现在 具有与b的原始值相同的值,将被写回到