SQLServer同时操作(all-in-once)特性



Select列表中创建的别名不能在Select子句之前执行的子句中使用。实际上,表达式别名甚至不能用于Select列表的其他表达式。该限制是由于SQL的另一个独有的特性,即同时操作(all-at-once operation)。例如,在下面这个Select列表中,计算表达式的逻辑顺序无关紧要,而且具有不确定性

Select c1+1 As e1,c2+1 As e2.

因此,不支持下面这个表达式:

Select c1+1 As e1,e1+1 As e2.

你只能在Select列表后面的步骤(Order By步骤)中使用列的别名。

 

理解:同时操作(all-at-once operation)

我们在大多数编程环境下,交换两个变量的值,通常会使用一个临时变量:

//假设有两个已赋值的int型变量ab

int temp;

temp=a;   a=b; b=temp;

当然只是通常的做法,你也可以运用逻辑运算符:

a = a ^ b;

b = b ^ a;

a = b ^ a;

或者:b = a + (a = b) * 0;

但,在SQL中交换列值可以使用下面的语句:

Update dbo.T1 Set c1=c2,c2=c1;

你应该假设所有操作同时发生,而事实上,在更新完成之前并不会修改表(可以理解为更新过程中表中的记录被锁定),而在计算出所有结果之后替换了现有表中的源数据

所以,下面的更新语句:

Update dbo.T1 Set c1=c1+(Select Max(c1) From dbo.T1);

该更新将影响T1表中的所有行,为C1列加上更新开始时T1中的最大的c1值。此时可以认为更新开始后表中的记录被锁住,数据库在后台处理、计算数据。计算完所有数据之后,将一次性替换所有数据。所以你不用担心最大的c1值会随着操作进行而持续变化,可以理解为操作在瞬间发生了。



版权声明:本文为博主原创文章,未经博主允许不得转载。