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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值