T-SQL中用來編寫流程控制模組的語句有:BEGIN...AND語句、IF...ELSE語句、CASE語句、WHILE語句、GOTO語句、BREAK語句、WAITFOR語句和RETURN語句。
1 BEGIN...AND語句
語句塊是多條Transact-SQL語句組成的程式碼段,從而可以執行一組Transact-SQL語句。BEGIN和END是控制流語言的關鍵字。BEGIN...END語句塊通常包含在其他控制流程中,用來完成不同流程中有差異的程式碼功能。
示例:
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)
執行結果:
count = 0 count = 1 count = 2 count = 3 count = 4 count = 5 count = 6 count = 7 count = 8 count = 9 loop finished, count = 10
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 關鍵字後面的任何語句。
5 WAITFOR語句
語法:
WAITFOR { DELAY 'time_to_pass' | TIME 'time_to_execute' | [ ( receive_statement ) | ( get_conversation_group_statement ) ] [ , TIMEOUT timeout ] }
5.1 DELAY引數
DELAY引數指定了等待的時間段。不能指定天數,只能指定小時數、分鐘數和秒數。允許延遲的最長時間為24小時。
WAITFOR DELAY '01:00'
將執行WAITFOR語句前的任何程式碼,然後到達WAITFOR語句,停止1小時,之後繼續執行下一條語句中的程式碼。
5.2 TIME引數
TIME引數指定到達指定時間的等待時間。
WAITFOR TIME '01:00'
將執行WAITFOR語句前的任何程式碼,然後到達WAITFOR語句,直到凌晨1點停止執行,之後執行WAITFOR語句後的下一條語句。