偶尔测试了一段小代码,写个循环
if object_id('tempdb..#TB') is not null drop table #TB go create table #TB ( ID int ) insert into #TB (ID) select 1 union all select 2 union all select 3 union all select 4 union all select 5 --代码1 declare @i int set @i = 1 while @i < 5 begin update #TB set ID = ID,@i = @i + 1 select @i end
--代码2
set @i = 1 while @i < 5 begin update #TB set ID = ID
set @i = @i + 1 select @i end
本来我觉得2段代码是一致的。都是执行了5次,那么@i = 6
但实际上,代码2是符合上述情况,执行了5次,@i = 6
但代码1 却只是执行了1次,@i = 6
对于这种情况,我只能猜测是update本身的机制。对于代码1,每一条影响记录,那么便执行一次@i = @i + 1。所以在一次循环里面就执行了5次,达到了while的阀值,跳出循环。
而对于代码2,则没有这个限制,顺序执行。
当然这只是个人猜想,还请各位指导。
这么一个简单的语句,一个不留神都踩坑,看来Sql Server里面的故事真不少啊