SQL SERVER中的流程控制語句
目錄
- 批處理
- 1、BEGIN...AND語句
- 2、IF...ELSE語句
- 3、 CASE語句
- 4、 WHILE語句
- 5、無條件退出語句RETURN
- 6、無條件跳轉(zhuǎn)語句GOTO
- 7、WAITFOR語句
- 7.1 DELAY參數(shù)
- 7.2 TIME參數(shù)
T-SQL中用來編寫流程控制模塊的語句有:BEGIN...AND語句、IF...ELSE語句、CASE語句、WHILE語句、GOTO語句、BREAK語句、WAITFOR語句和RETURN語句。
批處理
一個批處理段是由一個或者多個語句組成的一個批處理,之所以叫批處理是因為所有語句一次性被提交到一個SQL實例。
- 批處理是分批提交到SQL Server示例,因此在不同的批處理里局部變量不可訪問。
- 在不同批處理中,流程控制語句不能跨批處理。
- 如果想讓多個語句分多次提交到SQL實例,則需要使用GO關鍵字。GO關鍵字本身并不是一個SQL語句,GO關鍵字可以看作是一個批處理結(jié)束的標識符,當遇到GO關鍵字時,當前GO之前的語句會作為一個批處理直接傳到SQL實例執(zhí)行。
DECLARE @i int; SET @i = 1; GO--分批了 PRINT @i --@i在這個批里未定義
1、BEGIN...AND語句
語句塊是多條Transact-SQL語句組成的代碼段,從而可以執(zhí)行一組Transact-SQL語句。經(jīng)常與while或if...else組合起來使用,可以相互嵌套。
示例:
DECLARE @count INT SELECT @count = 0 WHILE @count < 10 BEGIN PRINT "count = " + CONVERT(VARCHAR(10), @count) SELECT @count = @count + 1 END PRINT "loop finished, count = " + CONVERT(VARCHAR(10), @count)
2、IF...ELSE語句
IF...ELSE語句用于在執(zhí)行一組代碼之前進行條件判斷,根據(jù)判斷的結(jié)果執(zhí)行不同的代碼。IF...ELSE語句語句對布爾表達式進行判斷,如果布爾表達式返回為TRUE,則執(zhí)行IF關鍵字后面的語句塊;如果布爾表達式返回FALSE,則執(zhí)行 ELSE關鍵字后面的語句塊。
語法:
IF Boolean_expression { sql_statement | statement_block } [ ELSE { sql_statement | statement_block } ]
示例:
DECLARE @score INT SET @score = 100 IF @score >= 60 PRINT "及格" ELSE PRINT "不及格"
3、 CASE語句
CASE語句是多條件分支語句,相比IF...ELSE語句,CASE語句進行分支流程控制可以使代碼更加清晰,易于理解。CASE語句根據(jù)表達式邏輯值的真假來決定執(zhí)行的代碼流程。
語法:
CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END
或
CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END
示例:
DECLARE @score INT SET @score = 100 SELECT CASE @score WHEN 100 THEN "滿分" WHEN 60 THEN "及格" END AS "成績"
或者
DECLARE @score INT SET @score = 100 SELECT CASE WHEN @score >= 90 THEN "優(yōu)秀" WHEN @score >= 80 THEN "良好" WHEN @score >= 70 THEN "中等" WHEN @score >= 60 THEN "及格" ELSE "不及格" END AS "成績"
4、 WHILE語句
WHILE語句根據(jù)條件重復執(zhí)行一條或多條T-SQL代碼,只要條件表達式為真,就循環(huán)執(zhí)行語句。可以使用 BREAK 和 CONTINUE 關鍵字在循環(huán)內(nèi)部控制 WHILE 循環(huán)中語句的執(zhí)行。
語法:
WHILE Boolean_expression { sql_statement | statement_block | BREAK | CONTINUE }
參數(shù):
- Boolean_expression:返回 TRUE 或 FALSE 的表達式。 如果布爾表達式中含有 SELECT 語句,則必須用括號將 SELECT 語句括起來。
- {sql_statement | statement_block}:Transact-SQL 語句或用語句塊定義的語句分組。 若要定義語句塊,請使用控制流關鍵字 BEGIN 和 END。
- BREAK:導致從最內(nèi)層的 WHILE 循環(huán)中退出。 將執(zhí)行出現(xiàn)在 END 關鍵字(循環(huán)結(jié)束的標記)后面的任何語句。
- CONTINUE:使 WHILE 循環(huán)重新開始執(zhí)行,忽略 CONTINUE 關鍵字后面的任何語句。
DECLARE @i int; SET @i = 0; WHILE(@i < 10) BEGIN SET @i = @i + 1; IF(@i % 2 = 0) BEGIN PRINT("跳過2的倍數(shù)" + CAST(@i AS varchar)); CONTINUE; END ELSE IF (@i = 7) BEGIN PRINT("到" + CAST(@i AS varchar) + "就跳出循環(huán)"); BREAK; END PRINT @i; END
5、無條件退出語句RETURN
RETURN語句用于使程序從一個查詢、存儲過程或批量處理中無條件返回,其后面的語句不再執(zhí)行。如果在存儲過程中使用return語句,那么此語句可以指定返回給調(diào)用應用程序、批處理或過程的負整數(shù);如果沒有為return指定整數(shù)值,那么該存儲過程將返回0。
BEGIN PRINT(1); PRINT(2); RETURN; PRINT(3); --在RETURN之后的代碼不會被執(zhí)行,因為會跳過當前批處理 END GO BEGIN PRINT(4); END
6、無條件跳轉(zhuǎn)語句GOTO
GOTO語句可以使程序無條件跳轉(zhuǎn)到指定的程序執(zhí)行點,增加了程序設計的靈活性。但破壞了程序的結(jié)構化,使程序結(jié)構變得復雜而且難以測試。
使用說明:語句標識符可以是數(shù)字或者字母的組合,但必須以":"結(jié)束。而在GOTO語句后的標識符不必帶":"。
注意事項:GOTO語句和跳轉(zhuǎn)標簽可以在存儲過程、批處理或語句塊中的任何地方使用,但不能超出批處理的范圍。
DECLARE @i int; 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
輸出結(jié)果如下:
跳到我了? 4
7、WAITFOR語句
waitfor語句用于掛起語句的執(zhí)行,直到指定的時間點或者指定的時間間隔。
語法:
WAITFOR { DELAY "time_to_pass" | TIME "time_to_execute" | [ ( receive_statement ) | ( get_conversation_group_statement ) ] [ , TIMEOUT timeout ] }
在waitfor語句中不能包含打開游標,定義視圖這樣的操作。在包含事務的語句中不要使用waitfor語句,因為waitfor語句在時間點或時間間隔執(zhí)行期間將一直擁有對象的鎖,當事務中包含waitfor語句,事務的其他語句又需要訪問被鎖住的數(shù)據(jù)對象事就容易發(fā)生死鎖現(xiàn)象。
7.1 DELAY參數(shù)
DELAY參數(shù)指定了等待的時間段。不能指定天數(shù),只能指定小時數(shù)、分鐘數(shù)和秒數(shù)。允許延遲的最長時間為24小時。
WAITFOR DELAY "01:00"
將運行WAITFOR語句前的任何代碼,然后到達WAITFOR語句,停止1小時,之后繼續(xù)執(zhí)行下一條語句中的代碼。
7.2 TIME參數(shù)
TIME參數(shù)指定到達指定時間的等待時間。
WAITFOR TIME "01:00"
將運行WAITFOR語句前的任何代碼,然后到達WAITFOR語句,直到凌晨1點停止執(zhí)行,之后執(zhí)行WAITFOR語句后的下一條語句。
到此這篇關于SQL SERVER流程控制語句的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持。
相關文章:
1. 在SQL Server中使用 Try Catch 處理異常的示例詳解2. SQL Server中的數(shù)據(jù)類型詳解3. 在SQL Server 2005數(shù)據(jù)庫中實現(xiàn)自動備份4. sql server發(fā)送郵件5. SQL Server 存儲過程嵌套示例6. SQL Server解析/操作Json格式字段數(shù)據(jù)的方法實例7. SQL Server的Collate語句需注意8. SQL Server下7種“數(shù)據(jù)分頁”方案全網(wǎng)最新最全9. SQL SERVER 2005 同步復制技術10. 剖析SQL Server 2005中的報告服務架構
