update tab1 set col1 = col2,col2 = col1

时间:2010-10-27 10:04:14

标签: sql sql-server-2008

此查询如何交换tab1的col1和col2的数据? 基本上交换我们需要临时变量,但在这里我们不是。那么sql server是如何做到的呢?

2 个答案:

答案 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子句。