說明:一個帶有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
參考引用:對於這種情況,我只能猜測是update本身的機制。對於程式碼1,每一條影響記錄,那麼便執行一次@i = @i + 1。所以在一次迴圈裡面就執行了5次,達到了while的閥值,跳出迴圈。
參考文獻:http://www.cnblogs.com/Gin-23333/p/4127453.html