Transact-SQL 語言使用的流程式控制制命令與常見的程式設計語言類似主要有以下幾種控制命令。
4.6.1 IF…ELSE
其文法如下:
IF <條件運算式>
<命令列或程式塊>
[ELSE [條件運算式]
<命令列或程式塊>]
其中<條件運算式>可以是各種運算式的組合,但運算式的值必須是邏輯值“真”或“假”。ELSE子句是可選的,最簡單的IF語句沒有ELSE子句部分。IF…ELSE用來判斷當某一條件成立時執行某段程式,條件不成立時執行另一段程式。如果不使用程式塊,IF或ELSE只能執行一條命令。IF…ELSE可以進行嵌套。
例4-9
declare@x int,@y int,@z int
select @x=1,@y=2, @z=3
if@x>@y
print'x>y' --列印字串'x>y'
else if@y>@z
print'y>z'
else print'z>y'
運行結果如下
z>y
注意:在Transact-SQL中最多可嵌套32級。
4.6.2 BEGIN…END
其文法如下:
BEGIN
<命令列或程式塊>
END
BEGIN…END用來設定一個程式塊,將在BEGIN…END內的所有程式視為一個單元執行BEGIN…END經常在條件陳述式,如IF…ELSE中使用。在BEGIN…END中可嵌套另外的BEGIN…END來定義另一程式塊。
4.6.3 CASE
CASE 命令有兩種語句格式:
CASE <運算式>
WHEN <運算式>THEN<運算式>
…
WHEN<運算式>THEN<運算式>
[ELSE<運算式>]
END
CASE
WHEN <條件運算式> THEN <運算式>
WHEN <條件運算式> THEN <運算式>
[ELSE <運算式>]
END
CASE命令可以嵌套到SQL命令中。
例4-10:調整員工工資,工作層級為“1”的上調8%,工作層級為“2”的上調7%,工作層級為“3”的上調6%,其它上調5%。
use pangu
update employee
set e_wage =
case
when job_level = ’1’ then e_wage*1.08
when job_level = ’2’ then e_wage*1.07
when job_level = ’3’ then e_wage*1.06
else e_wage*1.05
end
注意:執行CASE子句時,只運行第一個匹配的子名。
4.6.4 WHILE…CONTINUE…BREAK
其文法如下:
WHILE <條件運算式>
BEGIN
<命令列或程式塊>
[BREAK]
[CONTINUE]
[命令列或程式塊]
END
WHILE 命令在設定的條件成立時會重複執行命令列或程式塊。CONTINUE命令可以讓程式跳過CONTINUE 命令之後的語句,回到WHILE 迴圈的第一行命令。BREAK 命令則讓程式完全跳出迴圈,結束WHILE 命令的執行。WHILE 語句也可以嵌套。
例4-11:
declare @x int @y int @c int
例4-11:
declare @x int, @y int, @c int
select @x = 1, @y=1
while @x < 3
begin
print @x --列印變數x 的值
while @y < 3
begin
select @c = 100*@ x+ @y
print @c --列印變數c 的值
select @y = @y + 1
end
select @x = @x + 1
select @y = 1
end
運行結果如下
1
101
102
2
201
202
4.6.5 WAITFOR
其文法如下:
WAITFOR {DELAY <‘時間’> | TIME <‘時間’>
| ERROREXIT | PROCESSEXIT | MIRROREXIT}
WAITFOR 命令用來暫時停止程式執行,直到所設定的等待時間已過或所設定的時間已到才繼續往下執行。其中‘時間’必須為DATETIME 類型的資料,如:‘11:15:27’,
但不能包括日期各關鍵字含義如下:
- DELAY 用來設定等待的時間最多可達24 小時;
- TIME 用來設定等待結束的時間點;
- ERROREXIT 直到處理非正常中斷;
- PROCESSEXIT 直到處理正常或非正常中斷;
- MIRROREXIT 直到鏡像裝置失敗。
例4-12 等待1 小時2 分零3 秒後才執行SELECT 語句
waitfor delay ’01:02:03’
select * from employee
例4-13:等到晚上11 點零8 分後才執行SELECT 語句
waitfor time ’23:08:00’
select * from employee
4.6.6 GOTO
文法如下:
GOTO 標識符
GOTO 命令用來改變程式執行的流程,使程式跳到標有標識符的指定的程式行再繼續往下執行。作為跳轉目標的標識符可為數字與字元的組合,但必須以“:”結尾,如‘12:’或‘a_1:’。在GOTO 命令列,標識符後不必跟“:”。
例4-14 分行列印字元‘1’、‘2’、‘3’、‘4’、‘5’
declare @x int
select @x = 1
label_1
print @x
select @x = @x + 1
while @x < 6
goto label_1
4.6.7 RETURN
文法如下
RETURN [整數值]
RETURN 命令用於結束當前程式的執行,返回到上一個調用它的程式或其它程式。在括弧內可指定一個傳回值。
例4-15
declare @x int @y int
select @x = 1 @y = 2
if x>y
return 1
else
return 2
如果沒有指定傳回值,SQL Server 系統會根據程式執行的結果返回一個內定值,如
表4-5 所示。
如果運行過程產生了多個錯誤,SQL Server系統將返回絕對值最大的數值;如果此時使用者此時定義了傳回值,則以返回使用者定義的值。RETURN語句不能返回NULL值。