SQL SERVER中的流程控制語句
目錄
- 批處理
- 1、BEGIN...AND語句
- 2、IF...ELSE語句
- 3、 CASE語句
- 4、 WHILE語句
- 5、無條件退出語句RETURN
- 6、無條件跳轉語句GOTO
- 7、WAITFOR語句
- 7.1 DELAY參數
- 7.2 TIME參數
T-SQL中用來編寫流程控制模塊的語句有:BEGIN...AND語句、IF...ELSE語句、CASE語句、WHILE語句、GOTO語句、BREAK語句、WAITFOR語句和RETURN語句。
批處理
一個批處理段是由一個或者多個語句組成的一個批處理,之所以叫批處理是因為所有語句一次性被提交到一個SQL實例。
- 批處理是分批提交到SQL Server示例,因此在不同的批處理里局部變量不可訪問。
- 在不同批處理中,流程控制語句不能跨批處理。
- 如果想讓多個語句分多次提交到SQL實例,則需要使用GO關鍵字。GO關鍵字本身并不是一個SQL語句,GO關鍵字可以看作是一個批處理結束的標識符,當遇到GO關鍵字時,當前GO之前的語句會作為一個批處理直接傳到SQL實例執行。
DECLARE @i int; SET @i = 1; GO--分批了 PRINT @i --@i在這個批里未定義
1、BEGIN...AND語句
語句塊是多條Transact-SQL語句組成的代碼段,從而可以執行一組Transact-SQL語句。經常與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語句用于在執行一組代碼之前進行條件判斷,根據判斷的結果執行不同的代碼。IF...ELSE語句語句對布爾表達式進行判斷,如果布爾表達式返回為TRUE,則執行IF關鍵字后面的語句塊;如果布爾表達式返回FALSE,則執行 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語句根據表達式邏輯值的真假來決定執行的代碼流程。
語法:
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 "優秀" WHEN @score >= 80 THEN "良好" WHEN @score >= 70 THEN "中等" WHEN @score >= 60 THEN "及格" ELSE "不及格" END AS "成績"
4、 WHILE語句
WHILE語句根據條件重復執行一條或多條T-SQL代碼,只要條件表達式為真,就循環執行語句。可以使用 BREAK 和 CONTINUE 關鍵字在循環內部控制 WHILE 循環中語句的執行。
語法:
WHILE Boolean_expression { sql_statement | statement_block | BREAK | CONTINUE }
參數:
- Boolean_expression:返回 TRUE 或 FALSE 的表達式。 如果布爾表達式中含有 SELECT 語句,則必須用括號將 SELECT 語句括起來。
- {sql_statement | statement_block}:Transact-SQL 語句或用語句塊定義的語句分組。 若要定義語句塊,請使用控制流關鍵字 BEGIN 和 END。
- BREAK:導致從最內層的 WHILE 循環中退出。 將執行出現在 END 關鍵字(循環結束的標記)后面的任何語句。
- CONTINUE:使 WHILE 循環重新開始執行,忽略 CONTINUE 關鍵字后面的任何語句。
DECLARE @i int; SET @i = 0; WHILE(@i < 10) BEGIN SET @i = @i + 1; IF(@i % 2 = 0) BEGIN PRINT("跳過2的倍數" + CAST(@i AS varchar)); CONTINUE; END ELSE IF (@i = 7) BEGIN PRINT("到" + CAST(@i AS varchar) + "就跳出循環"); BREAK; END PRINT @i; END
5、無條件退出語句RETURN
RETURN語句用于使程序從一個查詢、存儲過程或批量處理中無條件返回,其后面的語句不再執行。如果在存儲過程中使用return語句,那么此語句可以指定返回給調用應用程序、批處理或過程的負整數;如果沒有為return指定整數值,那么該存儲過程將返回0。
BEGIN PRINT(1); PRINT(2); RETURN; PRINT(3); --在RETURN之后的代碼不會被執行,因為會跳過當前批處理 END GO BEGIN PRINT(4); END
6、無條件跳轉語句GOTO
GOTO語句可以使程序無條件跳轉到指定的程序執行點,增加了程序設計的靈活性。但破壞了程序的結構化,使程序結構變得復雜而且難以測試。
使用說明:語句標識符可以是數字或者字母的組合,但必須以":"結束。而在GOTO語句后的標識符不必帶":"。
注意事項:GOTO語句和跳轉標簽可以在存儲過程、批處理或語句塊中的任何地方使用,但不能超出批處理的范圍。
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
輸出結果如下:
跳到我了? 4
7、WAITFOR語句
waitfor語句用于掛起語句的執行,直到指定的時間點或者指定的時間間隔。
語法:
WAITFOR { DELAY "time_to_pass" | TIME "time_to_execute" | [ ( receive_statement ) | ( get_conversation_group_statement ) ] [ , TIMEOUT timeout ] }
在waitfor語句中不能包含打開游標,定義視圖這樣的操作。在包含事務的語句中不要使用waitfor語句,因為waitfor語句在時間點或時間間隔執行期間將一直擁有對象的鎖,當事務中包含waitfor語句,事務的其他語句又需要訪問被鎖住的數據對象事就容易發生死鎖現象。
7.1 DELAY參數
DELAY參數指定了等待的時間段。不能指定天數,只能指定小時數、分鐘數和秒數。允許延遲的最長時間為24小時。
WAITFOR DELAY "01:00"
將運行WAITFOR語句前的任何代碼,然后到達WAITFOR語句,停止1小時,之后繼續執行下一條語句中的代碼。
7.2 TIME參數
TIME參數指定到達指定時間的等待時間。
WAITFOR TIME "01:00"
將運行WAITFOR語句前的任何代碼,然后到達WAITFOR語句,直到凌晨1點停止執行,之后執行WAITFOR語句后的下一條語句。
到此這篇關于SQL SERVER流程控制語句的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持。
相關文章:
1. SQL SERVER 2005 同步復制技術2. 如何手動刪除 SQL Server 2000 默認實例、命名實例或虛擬實例3. SQL Server 2012 搭建數據庫AlwaysOn(數據庫高可用集群)4. sql server 2005 批量導入導出5. SQL Server使用PIVOT與unPIVOT實現行列轉換6. sql server 2000關于日期的查詢7. SQL Server 2005數據加密技術的實際應用8. sql server 2005中的DDL觸發器9. SQL Server判斷數據庫、表、列、視圖、存儲過程、函數是否存在總結10. SQL Server 2022 AlwaysOn新特性之包含可用性組詳解