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

解决方案 »

  1.   

    update過程是這樣的
    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
      

  2.   

    是一次执行的:
    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
      

  3.   

    运算符优先级 (Transact-SQL)当一个复杂的表达式有多个运算符时,运算符优先级决定执行运算的先后次序。执行的顺序可能严重地影响所得到的值。运算符的优先级别如下表中所示。在较低级别的运算符之前先对较高级别的运算符进行求值。级别  运算符  
    1
     ~(位非)
     
    2
     *(乘)、/(除)、%(取模)
     
    3
     +(正)、-(负)、+(加)、(+ 连接)、-(减)、&(位与)
     
    4
     =, >、<、>=、<=、<>、!=、!>、!<(比较运算符)
     
    5
     ^(位异或)、|(位或)
     
    6
     NOT
     
    7
     AND
     
    8
     ALL、ANY、BETWEEN、IN、LIKE、OR、SOME
     
    9
     =(赋值)
     当一个表达式中的两个运算符有相同的运算符优先级别时,将按照它们在表达式中的位置对其从左到右进行求值。例如,在下面的 SET 语句所使用的表达式中,在加运算符之前先对减运算符进行求值。
      

  4.   

    應該是:
    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 
      

  5.   

    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
      

  6.   

    给大家介绍一个J2EE、.NET视频下载站(免费哦)
    免费视频:
    浪曦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
      

  7.   

    证实:
    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
      

  8.   

    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中的优先级只是对几类运算符进行优先,而同类运算符则是从左到右进行计算,不知对否.
      

  9.   

    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中的优先级只是对几类运算符进行优先,而同类运算符则是从左到右进行计算,不知对否.
      

  10.   

    @id2=@id+2,@id=@id*2 涉及了两个表达式,都是为变量赋值的
    1:@id2=@id+2
    2:@id=@id*2
    它们的计算优先级应该是平等的,此时的技术顺序是从左向右而id=@id*10, @id=@id+id 涉及的两个表达式分别为为字段复制和为变量赋值
    1: id=@id*10 
    2: @id=@id+id
    其中为变量赋值的表达式优先。
      

  11.   

    declare @id intselect @id=2
    select @id=@id+2,@id=@id*2print @id2这样看看
      

  12.   

    declare @id  int
    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)一样.
      

  13.   

    按顺序计算
    @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)
      

  14.   

    declare @id  int
    declare @id2 int
    select @id=2
    select @id2=(case when @id>=5 then 1 else 0 end),@id=@id*3print @id2--不是乘法的的优先级别高于>=吗?
    为何结果是0呢?
      

  15.   

    楼主朋友,算符的优先级是指在一个表达式里才有优先级的说法,2个表达式互不干扰的.楼上说算符优先级的原因的不正确.
    楼主提出的问题发生,关键变量和表达式的解析先后.因为在sql中,变量是要比表达式优先编译计算的.也即是当计算完了
    变量的值后,再进行其他的处理,所以造成了你的那种问题.
      

  16.   

    从以上例子来讲,我觉得19楼的说法最正确了,并结合10楼的例子,应当是
    变量和表达式的解析先后的问题!很感谢tim_spac 这么热心的帮助..