Transact-SQL 語言使用的流程控制命令與常見的程序設(shè)計語言類似主要有以下幾種控制命令。
4.6.1 IF…ELSE 其語法如下: IF <條件表達(dá)式> <命令行或程序塊> [ELSE [條件表達(dá)式] <命令行或程序塊>] 其中<條件表達(dá)式>可以是各種表達(dá)式的組合,但表達(dá)式的值必須是邏輯值“真”或“假”。ELSE子句是可選的,最簡單的IF語句沒有ELSE子句部分。IF…ELSE用來判斷當(dāng)某一條件成立時執(zhí)行某段程序,條件不成立時執(zhí)行另一段程序。如果不使用程序塊,IF或ELSE只能執(zhí)行一條命令。IF…ELSE可以進(jìn)行嵌套。
例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' 運行結(jié)果如下 z>y 注意:在Transact-SQL中最多可嵌套32級。
4.6.2 BEGIN…END 其語法如下: BEGIN <命令行或程序塊> END BEGIN…END用來設(shè)定一個程序塊,將在BEGIN…END內(nèi)的所有程序視為一個單元執(zhí)行BEGIN…END經(jīng)常在條件語句,如IF…ELSE中使用。在BEGIN…END中可嵌套另外的BEGIN…END來定義另一程序塊。
4.6.3 CASE CASE 命令有兩種語句格式: CASE <運算式> WHEN <運算式>THEN<運算式> … WHEN<運算式>THEN<運算式> [ELSE<運算式>] END
CASE WHEN <條件表達(dá)式> THEN <運算式> WHEN <條件表達(dá)式> THEN <運算式> [ELSE <運算式>] END CASE命令可以嵌套到SQL命令中。 例4-10:調(diào)整員工工資,工作級別為“1”的上調(diào)8%,工作級別為“2”的上調(diào)7%,工作級別為“3”的上調(diào)6%,其它上調(diào)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 注意:執(zhí)行CASE子句時,只運行第一個匹配的子名。
4.6.4 WHILE…CONTINUE…BREAK 其語法如下: WHILE <條件表達(dá)式> BEGIN <命令行或程序塊> [BREAK] [CONTINUE] [命令行或程序塊] END WHILE 命令在設(shè)定的條件成立時會重復(fù)執(zhí)行命令行或程序塊。CONTINUE命令可以讓程序跳過CONTINUE 命令之后的語句,回到WHILE 循環(huán)的第一行命令。BREAK 命令則讓程序完全跳出循環(huán),結(jié)束WHILE 命令的執(zhí)行。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 運行結(jié)果如下 1 101 102 2 201 202
4.6.5 WAITFOR 其語法如下: WAITFOR {DELAY <‘時間’> | TIME <‘時間’> | ERROREXIT | PROCESSEXIT | MIRROREXIT} WAITFOR 命令用來暫時停止程序執(zhí)行,直到所設(shè)定的等待時間已過或所設(shè)定的時間已到才繼續(xù)往下執(zhí)行。其中‘時間’必須為DATETIME 類型的數(shù)據(jù),如:‘11:15:27’, 但不能包括日期各關(guān)鍵字含義如下:
- DELAY 用來設(shè)定等待的時間最多可達(dá)24 小時;
- TIME 用來設(shè)定等待結(jié)束的時間點;
- ERROREXIT 直到處理非正常中斷;
- PROCESSEXIT 直到處理正常或非正常中斷;
- MIRROREXIT 直到鏡像設(shè)備失敗。
例4-12 等待1 小時2 分零3 秒后才執(zhí)行SELECT 語句 waitfor delay ’01:02:03’ select * from employee 例4-13:等到晚上11 點零8 分后才執(zhí)行SELECT 語句 waitfor time ’23:08:00’ select * from employee
4.6.6 GOTO 語法如下: GOTO 標(biāo)識符 GOTO 命令用來改變程序執(zhí)行的流程,使程序跳到標(biāo)有標(biāo)識符的指定的程序行再繼續(xù)往下執(zhí)行。作為跳轉(zhuǎn)目標(biāo)的標(biāo)識符可為數(shù)字與字符的組合,但必須以“:”結(jié)尾,如‘12:’或‘a(chǎn)_1:’。在GOTO 命令行,標(biāo)識符后不必跟“:”。 例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 [整數(shù)值] RETURN 命令用于結(jié)束當(dāng)前程序的執(zhí)行,返回到上一個調(diào)用它的程序或其它程序。在括號內(nèi)可指定一個返回值。 例4-15 declare @x int @y int select @x = 1 @y = 2 if x>y return 1 else return 2 如果沒有指定返回值,SQL Server 系統(tǒng)會根據(jù)程序執(zhí)行的結(jié)果返回一個內(nèi)定值,如 表4-5 所示。
如果運行過程產(chǎn)生了多個錯誤,SQL Server系統(tǒng)將返回絕對值最大的數(shù)值;如果此時用戶此時定義了返回值,則以返回用戶定義的值。RETURN語句不能返回NULL值。
|