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

    技术2025-08-12  9

    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值会随着操作进行而持续变化,可以理解为操作在瞬间发生了。

    最新回复(0)