Home [SQL] GOTO
Post
Cancel

[SQL] GOTO

程式會直接跳到GOTO所指定的標籤位置,中間跳過的區域全都不執行。
結構複雜的程式碼非常不建議使用,因為容易造成流程混亂!
如需進行流程控制,建議使用IF條件判斷較佳。

語法

1
2
3
4
Label: --設定標籤
/*很多行程式碼*/
GOTO Label --跳到標籤
/*很多行程式碼*/

範例1:GOTO用於循環

1
2
3
4
5
6
7
declare @i int = 1 --宣告變數i,初始值為1
loopstart: --設定標籤
begin
    print @i --顯示i值
    set @i += 1 --設定變數i+1
    while (@i <= 10) goto loopstart --跳到loopstart標籤
end

執行結果:印出1~10

範例2:GOTO求總和

利用GOTO語句求出從1加到5的總和

1
2
3
4
5
6
declare @i int = 1, @sum int = 0
loopstart: --設定標籤
    set @sum += @i --加總
    set @i += 1 --設定變數i+1
if(@i < 5) goto loopstart --跳到loopstart標籤
print @sum --印出總和

執行結果: 15

注意:

標籤位置的程式碼不單單是跳轉執行,程式自上往下正常運作時,到達標籤處也會執行的,
所以標籤的程式碼作用如果用於錯誤判斷或交易提交的話,通常會放在程式碼的結尾,比如:

1
2
3
4
5
6
7
8
9
10
11
12
--標籤的程式碼作用如果用於錯誤判斷或交易提交的話,
--通常會放在程式碼的結尾

OK: --程式正常運作到結尾時會執行
  COMMIT TRAN    
  SELECT 0    
  RETURN  --return 作用是避免 ERR:標籤被執行  
    
ERR: --僅用於goto跳躍呼叫
  ROLLBACK TRAN    
  SELECT -1    
  RETURN 

上面程式碼通常放置預存程序的末尾,用於標籤跳轉。
其中 OK: 是程式正常運作到結尾時會執行,
retrun 的作用 是避免 標籤 ERR: 被執行,
因此,標籤ERR: 僅用於GOTO 跳躍呼叫。

MSDN - GOTO (Transact-SQL)
MSSQL中的 GOTO 语句
PL/SQL goto语句
[T-SQL] T-SQL 基本介紹_筆記

This post is licensed under CC BY 4.0 by the author.