使用来自同一记录的值进行SQL更新

使用来自同一记录的值进行SQL更新

问题描述:

在以下语句中,f1总是会得到f2以前的值吗?或者f2有时会首先更新,f1最后会更新为NULL?我的印象是,新的价值在声明中不可用,f2在处理记录时具有旧的价值,但我找不到一个说明这一点的权威地方。使用来自同一记录的值进行SQL更新

UPDATE x 
SET 
    x.f1 = x.f2, 
    x.f2 = NULL 

概念操作发生"all at once"因此, “之前” 的价值观

它将使用的确

UPDATE x 
SET 
x.f1 = x.f2, 
x.f2 = x.f1 

也将正常工作交换两个列值。

+0

谢谢! '一下子'是我需要查找和阅读的术语/概念。干杯。 – 2012-07-25 16:38:10

f1总是会得到UPDATEf2的前值。

从技术上讲,记录被删除并重新插入。因此,SQL将计算新记录的内容,然后删除当前记录,然后插入新记录。

本文中有关SQL触发器可能有助于解释:受影响的行的过程中DELETE和UPDATE语句

删除的表存储的副本。在执行DELETE或UPDATE语句期间,将从触发器表中删除行并将其传输到已删除的表中。删除的表和触发器表通常没有行。

插入的表在INSERT 和UPDATE语句中存储受影响的行的副本。在插入或更新事务期间,新插入的表和触发器表中都会添加新行 行。插入表中的 行是触发器 表中新行的副本。

http://msdn.microsoft.com/en-us/library/ms191300.aspx

+0

你是什么意思“从技术上讲”记录被删除,并重新插入? SQL Server可以实现更新。而TBH我根本没有看到触发器的相关性。 – 2012-07-25 16:09:01

+0

@MartinSmith查看我引用的文字。在UPDATE记录被删除和插入的过程中,我的印象是什么? – Curt 2012-07-25 16:10:38

+0

仅在某些情况下。例如,如果聚簇索引键列被更新并且行需要移动。 – 2012-07-25 16:11:24