SqlServer——神奇程式碼1之Update

[0]發表於2015-01-04

說明:一個帶有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

相關文章