首頁 > 軟體

SQL SERVER中的流程控制語句

2022-05-24 14:02:50

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流程控制語句的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com