控制流語句sql
批處理:數據庫
一個批處理段是由一個或者多個語句組成的一個批處理,之因此叫批處理是由於全部語句一次性被提交到一個SQL實例。express
批處理是分批提交到SQL Server示例,所以在不一樣的批處理裏局部變量不可訪問。編程
在不一樣批處理中,流程控制語句不能跨批處理。編程語言
若是想讓多個語句分屢次提交到SQL實例,則須要使用GO關鍵字。GO關鍵字自己並非一個SQL語句,GO關鍵字能夠看做是一個批處理結束的標識符,當遇到GO關鍵字時,當前GO以前的語句會做爲一個批處理直接傳到SQL實例執行。 ide
不一樣的批處理局部變量不可訪問,例如:測試
DECLARE@iint; SET@i=1; GO--分批了PRINT@i--@i在這個批裏未定義spa
輸出:命令行
消息 137,級別 15,狀態 2,第 1 行必須聲明標量變量 "@i"。設計
控制流語句不能跨批處理,例如:
DECLARE@iint; SET@i=1; IF(@i=1) PRINT('1'); GO--分批了ELSEPRINT('不知道'); --ELSE找不到IF了,控制流語句不跨批,所以報錯。
輸出結果以下:
1消息 156,級別 15,狀態 1,第 1 行關鍵字 'ELSE' 附近有語法錯誤。
控制流語句也稱爲流程控制語句,是和高級編程語言中的相似功能一致的,引入控制流語句將使T-SQL代碼有順序執行轉變爲按控制執行。
一、程序塊語句BEGIN...END
程序塊語句用於將多條T-SQL語句封裝起來構成一個程序塊。SQLServer在處理時,將整個程序塊視爲一條T-SQL語句執行。
begin <T-SQL命令行或程序塊>end
常常與while或if...else組合起來使用,能夠相互嵌套。
二、判斷語句IF...ELSE
if...else語句用於條件測試,系統將根據條件知足與否來決定如何執行語句,else子句是可選的。
語法:
if 邏輯表達式 語句塊1 else 語句塊2 語句塊3
if的形式一般包括if exists(用於判斷是否存在)和if not(是否條件不知足)
綜合示例:
DECLARE@iintSET@i=10;IF(@i<5) PRINT'小於5';ELSEIF(@i<8) BEGINPRINT'小於8'ENDELSEBEGINPRINT'前面都不知足!'END
以上代碼在SQL Server中執行後輸出前面都不知足!
三、循環語句WHILE
while語句用於執行循環,能夠根據循環條件重複執行語句塊。一般使用break和continue關鍵字在循環內部進行控制。
語法:
while<條件表達式><sql語句塊1>[break]<sql語句塊2>[continue]<sql語句塊3>
break語句讓程序跳出循環體,結束while的循環。
continue語句讓程序跳過[sql語句塊3],回到while<條件表達式>,從新判斷邏輯值執行。
where語句能夠互相嵌套。
示例:
DECLARE@iint;SET@i=0;WHILE(@i<10)BEGINSET@i=@i+1; IF(@i%2=0) BEGINPRINT('跳過2的倍數'+CAST(@iASvarchar)); CONTINUE; ENDELSEIF (@i=7) BEGINPRINT('到'+CAST(@iASvarchar) +'就跳出循環'); BREAK; ENDPRINT@i;END
輸出結果以下所示:
1跳過2的倍數23跳過2的倍數45跳過2的倍數6到7就跳出循環
四、分支判斷語句CASE
CASE語句用於執行多條件的分支判斷。
語法格式:
CASE input_expression WHEN when_expression THEN result_expression [...n][ ELSE else_result_expression ]END
如今來寫個實例:先給出一張表:
要求查出如下信息:
SQL語句以下:
select Team,Rq, sum(casewhen winlose='勝'then1else0end) as 勝,sum(casewhen winlose='負'then1else0end) as 負from testgroupby Rq,Teamhaving Team ='曼聯'
再來一個,一張表只有Id,Sex兩個字段,要求用一條SQL語句將Sex字段的'男'變'女','女'變'男'。
update table_1 set sex = (casewhen sex='男'then'女'when sex='女'then'男'end)
執行完SQL語句後,結果以下:
再來一個有一張表,裏面有3個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。
SQL語句以下:
select Id, (casewhen chinese >=80then'優秀'when chinese >=60then'及格'else'不及格'end) as 語文, (casewhen math >=80then'優秀'when math >=60then'及格'else'不及格'end) as 數學, (casewhen english >=80then'優秀'when english >=60then'及格'else'不及格'end) as 英語from fenshu
五、無條件退出語句RETURN
RETURN語句用於使程序從一個查詢、存儲過程或批量處理中無條件返回,其後面的語句再也不執行。若是在存儲過程當中使用return語句,那麼此語句能夠指定返回給調用應用程序、批處理或過程的整數;若是沒有爲return指定整數值,那麼該存儲過程將返回0。
存儲過程返回值:
返回值 |
含義 |
0 |
存儲過程執行成功 |
-1 |
沒有找到數據庫對象 |
-2 |
數據類型錯誤 |
-3 |
進程死鎖錯誤 |
-4 |
進程死鎖錯誤 |
-5 |
語法錯誤 |
-6 |
其餘用戶錯誤 |
-7 |
資源錯誤 |
-8 |
非致命的內部錯誤 |
-9 |
達到系統配置參數極限 |
-10 |
內部一致性致命錯誤 |
-11 |
內部一致性致命錯誤 |
-12 |
表或索引崩潰 |
-13 |
數據庫崩潰 |
-14 |
硬件錯誤 |
語法:
return[整數表達式]
示例:
BEGINPRINT(1); PRINT(2); RETURN; PRINT(3); --在RETURN以後的代碼不會被執行,由於會跳過當前批處理ENDGOBEGINPRINT(4);END
輸出以下:
1 2 4 |
六、無條件跳轉語句GOTO
GOTO語句可使程序無條件跳轉到指定的程序執行點,增長了程序設計的靈活性。但破壞了程序的結構化,使程序結構變得複雜並且難以測試。
語法:
GOTO 語句標識符
使用說明:
語句標識符能夠是數字或者字母的組合,但必須以":"結束。而在GOTO語句後的標識符沒必要帶":"。
注意事項:
GOTO語句和跳轉標籤能夠在存儲過程、批處理或語句塊中的任何地方使用,但不能超出批處理的範圍。
示例:
DECLARE@iint;SET@i=1;SET@i=2;SET@i=3;SET@i=4;GOTO ME;SET@i=5; --這行被跳過了SET@i=6; --這行被跳過了SET@i=7; --這行被跳過了ME:PRINT('跳到我了?');PRINT@i
輸出結果以下:
跳到我了? 4 |
七、延期執行語句WAITFOR
waitfor語句用於掛起語句的執行,直到指定的時間點或者指定的時間間隔。
一、指定時間點的語法
waitfor { Time 'time' }
示例:
WAITFOR DELAY '00:00:03'BEGINPRINT'延遲3秒輸出!'; END
二、指定等待時間間隔的語法
waitfor { delay 'interval' }
interval爲時間間隔,指定執行waitfor語句以前須要等待的時間,最多爲24小時。
waitfor語句經常使用語某個特定的時間點或時間間隔自動執行某些任務。在waitfor語句中不能包含打開遊標,定義視圖這樣的操做。在包含事務的語句中不要使用waitfor語句,由於waitfor語句在時間點或時間間隔執行期間將一直擁有對象的鎖,當事務中包含waitfor語句,事務的其餘語句又須要訪問被鎖住的數據對象事就容易發生死鎖現象。
示例:對着始終來看真是分絕不差啊。
WAITFOR TIME '15:49:22'BEGINPRINT'定時輸出'END