create table T(id int)insert into T select 1 union select 2 union select 3 declare @id int select @id=2 update T set id=@id,@id=@id+1/*结果: 3 4 5 */为何不是 2 3 4
9 =(赋值) 当一个表达式中的两个运算符有相同的运算符优先级别时,将按照它们在表达式中的位置对其从左到右进行求值。例如,在下面的 SET 语句所使用的表达式中,在加运算符之前先对减运算符进行求值。
應該是: update過程是這樣的 1, update T set id=3,@id=2+1 2, update T set id=4,@id=3+1 3, update T set id=5,@id=4+1
create table T(id int)insert into T select 1 union all select 2 union all select 1 union all select 2 declare @id int select @id=2 update T set id=@id,@id=@id+10select * from Tdrop table T /* id 12 22 32 42*/ 实验表明:3l的猜测是错误的。 先执行了@id=@id+10,再执行了id=@id
证实: create table T(id int)insert into T select 1 union all select 1 union all select 1 union all select 1 declare @id int select @id=2 update T set id=@id*10, @id=@id+id select * from Tdrop table T-- id -- 30 -- 40 -- 50 -- 60
SQL SERVER帮助上有这样一段话:当一个复杂的表达式有多个运算符时,运算符优先性决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。运算符有下面这些优先等级。在较低等级的运算符之前先对较高等级的运算符进行求值。 +(正)、-(负)、~(按位 NOT) *(乘)、/(除)、%(模) +(加)、(+ 串联)、-(减) =, >, <, >=, <=, <>, !=, !>, !< 比较运算符 ^(位异或)、&(位与)、|(位或) NOT AND ALL、ANY、BETWEEN、IN、LIKE、OR、SOME =(赋值) 以上说明+(加)的优先级低于*(乘)那么以下又如何解释:declare @id int declare @id2 int select @id=2 select @id2=@id+2,@id=@id*2 print '@id2='+cast(@id2 as char(2)) print '@id='+cast(@id as char(2)) /* @id2=4 @id=4 */如果按照乘法的优先高于加法 则结果应该为 @id2=6 @id=4请解释...我有个理解就是 SQL SERVER中的优先级只是对几类运算符进行优先,而同类运算符则是从左到右进行计算,不知对否.
SQL SERVER帮助上有这样一段话:当一个复杂的表达式有多个运算符时,运算符优先性决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。运算符有下面这些优先等级。在较低等级的运算符之前先对较高等级的运算符进行求值。 +(正)、-(负)、~(按位 NOT) *(乘)、/(除)、%(模) +(加)、(+ 串联)、-(减) =, >, <, >=, <=, <>, !=, !>, !< 比较运算符 ^(位异或)、&(位与)、|(位或) NOT AND ALL、ANY、BETWEEN、IN、LIKE、OR、SOME =(赋值) 以上说明+(加)的优先级低于*(乘)那么以下又如何解释:declare @id int declare @id2 int select @id=2 select @id2=@id+2,@id=@id*2 print '@id2='+cast(@id2 as char(2)) print '@id='+cast(@id as char(2)) /* @id2=4 @id=4 */如果按照乘法的优先高于加法 则结果应该为 @id2=6 @id=4请解释...我有个理解就是 SQL SERVER中的优先级只是对几类运算符进行优先,而同类运算符则是从左到右进行计算,不知对否.
1, update T set id=2,@id=2+1
2, update T set id=3,@id=3+1
3, update T set id=4,@id=4+1
id=1+2 -- (@id=2), @id = 2(@id=2)+1
id=2+2 -- (@id=2), @id = 2(@id=2)+1
id=3+2 -- (@id=2), @id = 2(@id=2)+1
1
~(位非)
2
*(乘)、/(除)、%(取模)
3
+(正)、-(负)、+(加)、(+ 连接)、-(减)、&(位与)
4
=, >、<、>=、<=、<>、!=、!>、!<(比较运算符)
5
^(位异或)、|(位或)
6
NOT
7
AND
8
ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
9
=(赋值)
当一个表达式中的两个运算符有相同的运算符优先级别时,将按照它们在表达式中的位置对其从左到右进行求值。例如,在下面的 SET 语句所使用的表达式中,在加运算符之前先对减运算符进行求值。
update過程是這樣的
1, update T set id=3,@id=2+1
2, update T set id=4,@id=3+1
3, update T set id=5,@id=4+1
select 1 union all
select 2 union all
select 1 union all
select 2
declare @id int
select @id=2
update T set id=@id,@id=@id+10select * from Tdrop table T
/*
id
12
22
32
42*/
实验表明:3l的猜测是错误的。
先执行了@id=@id+10,再执行了id=@id
免费视频:
浪曦ASP.NET企业实战系列 http://down1.langsin.com/001.rar
浪曦NUnit详解视频 http://down1.langsin.com/002.rar
浪曦Struts 2应用开发详解 http://www.verycd.com/topics/210454
VIP视频:
浪曦Java常见笔试、面试题目深度剖析 http://down1.langsin.com/003.rar
浪曦J2EE测试实用指南http://down1.langsin.com/005.rar
浪曦Lucene视频教程 http://down1.langsin.com/006.rar
浪曦电脑维护项目 http://down1.langsin.com/007.rar
培训视频:
浪曦ExtJS视频之Grid控件 http://down1.langsin.com/008.rar
业务QQ:1050429531
create table T(id int)insert into T
select 1 union all
select 1 union all
select 1 union all
select 1
declare @id int
select @id=2
update T set id=@id*10, @id=@id+id select * from Tdrop table T-- id
-- 30
-- 40
-- 50
-- 60
*(乘)、/(除)、%(模)
+(加)、(+ 串联)、-(减)
=, >, <, >=, <=, <>, !=, !>, !< 比较运算符
^(位异或)、&(位与)、|(位或)
NOT
AND
ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
=(赋值)
以上说明+(加)的优先级低于*(乘)那么以下又如何解释:declare @id int
declare @id2 int select @id=2
select @id2=@id+2,@id=@id*2 print '@id2='+cast(@id2 as char(2))
print '@id='+cast(@id as char(2))
/*
@id2=4
@id=4
*/如果按照乘法的优先高于加法
则结果应该为
@id2=6
@id=4请解释...我有个理解就是
SQL SERVER中的优先级只是对几类运算符进行优先,而同类运算符则是从左到右进行计算,不知对否.
*(乘)、/(除)、%(模)
+(加)、(+ 串联)、-(减)
=, >, <, >=, <=, <>, !=, !>, !< 比较运算符
^(位异或)、&(位与)、|(位或)
NOT
AND
ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
=(赋值)
以上说明+(加)的优先级低于*(乘)那么以下又如何解释:declare @id int
declare @id2 int select @id=2
select @id2=@id+2,@id=@id*2 print '@id2='+cast(@id2 as char(2))
print '@id='+cast(@id as char(2))
/*
@id2=4
@id=4
*/如果按照乘法的优先高于加法
则结果应该为
@id2=6
@id=4请解释...我有个理解就是
SQL SERVER中的优先级只是对几类运算符进行优先,而同类运算符则是从左到右进行计算,不知对否.
1:@id2=@id+2
2:@id=@id*2
它们的计算优先级应该是平等的,此时的技术顺序是从左向右而id=@id*10, @id=@id+id 涉及的两个表达式分别为为字段复制和为变量赋值
1: id=@id*10
2: @id=@id+id
其中为变量赋值的表达式优先。
select @id=@id+2,@id=@id*2print @id2这样看看
declare @id2 int
declare @id3 intselect @id=2 select @id2=@id+2,@id=@id*2---表达式1print '@id2='+cast(@id2 as char(2))select @id=2 --再赋值select @id=@id+2,@id=@id*2 ---表达式2print '@id='+cast(@id as char(2))--为何@id与@id2的值不相同,
--表达式1与表达式2的区别只是在赋的值(@id,@id2)一样.
@id2=@id+2,@id=@id*2---表达式1
: @id2 = 2 + 2 (4) 然后再 @id = 2 × 2 (4)@id=@id+2,@id=@id*2 ---表达式2
: @id = 2 + 2 (4) 然后再 @id = 4 × 2 (8)
declare @id2 int
select @id=2
select @id2=(case when @id>=5 then 1 else 0 end),@id=@id*3print @id2--不是乘法的的优先级别高于>=吗?
为何结果是0呢?
楼主提出的问题发生,关键变量和表达式的解析先后.因为在sql中,变量是要比表达式优先编译计算的.也即是当计算完了
变量的值后,再进行其他的处理,所以造成了你的那种问题.
变量和表达式的解析先后的问题!很感谢tim_spac 这么热心的帮助..