• SqlServer——神奇代码1之Update


    说明:一个带有update的循环的代码。很简单,但是在QQ群里问了,应该说是很少有人注意这个问题,也就是很少有人真的理解SQL中的Update。

    代码如下:

    if object_id('tempdb..#TB') is not null
        drop table #TB
    go
    
    --创建的是临时表
    create table #TB
    (
        ID int
    )
    --插入5条记录
    insert into #TB (ID)
    select 1
    union all
    select 2
    union all
    select 3
    union all
    select 4
    union all
    select 5
    
    --查看记录
    select * from #TB
    go
    
    --代码1
    declare @i int 
    set @i = 1
    while @i < 5
    begin
        update #TB set ID = ID,@i = @i + 1
        select @i
    end
    go
    
    --代码2
    declare @i int
    set @i = 1
    while @i < 5
    begin
        update #TB set ID = ID
        set @i = @i + 1
        select @i    
    end

    从代码看无非就是建立了一个临时表,插入5条记录,然后代码1和代码2没有太大的差别,初次看见认为2次的循环都是4次,@i的结果应该都是5,如果你这么想,劝你还是把代码执行一遍吧,自己先想想,你的认为是错的。

    正确的结果是:

    代码1的循环次数1次,@i的结果6

    代码2的循环次数4次,@i的结果5

    看到这里,在好好的回去理解下代码,尤其是理解下update,然后再看后面的解释。

    代码解释:

    两端代码的区别无非是在update这一行,代码1将2条小语句写在一行上面,而代码2分两行写了,这就是问题的所在。
    
    代码1执行分析:
    
    @i=1
    
    While@i <5)
    
    {
    
    通过循环判断
    
    执行update,因为Update是修改ID字段的记录,记录数5条,则Update这行的代码执行5次,所以@i = @i + 1也连带的执行5次,完毕后,@i=6
    
    输出@i
    
    循环判断(@i <5)false跳出
    
    }
    
    说以,代码1的循环次数为1,但是@i=6
    
     
    
    代码2执行分析:
    
    @i=1
    
    While@i <5)
    
    {
    
    通过循环判断
    
    执行update,因为Update是修改ID字段的记录,记录数5条,则Update这行的代码执行5次,但是代码2该行没有@i = @i + 1所以完毕后,@i=1
    
    @i = @i + 1@i = 2
    
    输出@i
    
    循环判断(@i <5)true,再次执行循环,知道false
    
    }
    
    说以,代码2的循环次数为4,但是@i=5
    View Code

    参考引用:对于这种情况,我只能猜测是update本身的机制。对于代码1,每一条影响记录,那么便执行一次@i = @i + 1。所以在一次循环里面就执行了5次,达到了while的阀值,跳出循环。

    参考文献:http://www.cnblogs.com/Gin-23333/p/4127453.html

  • 相关阅读:
    【洛谷 P4166】 [SCOI2007]最大土地面积(凸包,旋转卡壳)
    专题
    【洛谷 P3299】 [SDOI2013]保护出题人 (凸包,三分,斜率优化)
    【洛谷 P3628】 [APIO2010]特别行动队 (斜率优化)
    $POJ1995$ $Raising$ $Modulo$ $Numbers$
    快速运算模板(未完待续)
    $Luogu$ $P1879$ $[USACO06NOV]$ 玉米田 $Corn Fields$
    [转载] $AT2444$ 题解
    [转载] $CF117B$ 题解
    [转载] $CF543B$ 题解
  • 原文地址:https://www.cnblogs.com/zi-xing/p/4201574.html
Copyright © 2020-2023  润新知