此查询如何交换tab1的col1和col2的数据? 基本上交换我们需要临时变量,但在这里我们不是。那么sql server是如何做到的呢?
答案 0 :(得分:4)
就是这样:
UPDATE tabl
SET col1 = col2,
col2 = col1
没有DML
查询查看其结果,以避免Halloween problem。
在内部,UPDATE
锁定放在记录(或数据页面)上,旧值被读取并存储到临时变量中,然后锁定被提升为EXCLUSIVE
和新值(存储在临时变量中)写入适当的列。
答案 1 :(得分:0)
我的笔记归功于Joe Celko:
<set clause list>
中的每个作业都是并行执行的
每个SET子句一次更改所有限定行。或至少
这是理论模型。在实践中,首先实现
使用WHERE在一次传递中标记表中的所有限定行
条款。如果没有问题,那么SQL引擎会复制
工作存储中的每个标记行。每个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列。在该对的第二个UPDATE中,a,现在
具有与b的原始值相同的值,将被写回
b栏 - 完全没有变化。关于什么,有一些限制
值表达式可以。同一列不能出现多次
在<set clause list>
中 - 考虑到并行性,这是有道理的
声明。由于两者同时生效,你会这样做
不知道使用哪个SET子句。