首页 > 代码库 > SQL——神奇代码1之Update

SQL——神奇代码1之Update

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

代码如下:

if object_id(tempdb..#TB) is not null    drop table #TBgo--创建的是临时表create table #TB(    ID int)--插入5条记录insert into #TB (ID)select 1union allselect 2union allselect 3union allselect 4union allselect 5--查看记录select * from #TBgo--代码1declare @i int set @i = 1while @i < 5begin    update #TB set ID = ID,@i = @i + 1    select @iendgo--代码2declare @i intset @i = 1while @i < 5begin    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=1While@i <5){通过循环判断执行update,因为Update是修改ID字段的记录,记录数5条,则Update这行的代码执行5次,所以@i = @i + 1也连带的执行5次,完毕后,@i=6输出@i循环判断(@i <5)false跳出}说以,代码1的循环次数为1,但是@i=6 代码2执行分析:@i=1While@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

SQL——神奇代码1之Update