WHILE (Transact-SQL)

設定重複執行 SQL 陳述式或陳述式區塊的條件。只要符合指定的條件,就會重複執行這些陳述式。您可以在迴圈內,利用 BREAK 和 CONTINUE 關鍵字來控制 WHILE 迴圈陳述式的執行情況。

主題連結圖示Transact-SQL 語法慣例

語法

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 關鍵字之後的任何陳述式。

備註

如果一或多個 WHILE 迴圈具有巢狀結構,內層的 BREAK 會跳到下一個最外層的迴圈。內層迴圈尾端之後的所有陳述式會先執行,然後重新啟動下一個最外層迴圈。

範例

A. 搭配巢狀 IF...ELSE 和 WHILE 來使用 BREAK 和 CONTINUE

在下列範例中,如果產品的平均標價小於 $300,WHILE 迴圈會將標價加倍,再設定最大價格。如果最大價格小於或等於 $500,WHILE 迴圈會重新啟動,價格會再加倍。這個迴圈會繼續使價格加倍,直到最大價格大於 $500,再結束 WHILE 迴圈及列印訊息。

USE AdventureWorks;
GO
WHILE (SELECT AVG(ListPrice) FROM Production.Product) < $300
BEGIN
   UPDATE Production.Product
      SET ListPrice = ListPrice * 2
   SELECT MAX(ListPrice) FROM Production.Product
   IF (SELECT MAX(ListPrice) FROM Production.Product) > $500
      BREAK
   ELSE
      CONTINUE
END
PRINT 'Too much for the market to bear';

B. 在資料指標中使用 WHILE

下列範例使用 @@FETCH_STATUS 控制 WHILE 迴圈中的資料指標活動。

DECLARE Employee_Cursor CURSOR FOR
SELECT EmployeeID, Title 
FROM AdventureWorks.HumanResources.Employee
WHERE ManagerID =3;
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
   BEGIN
      FETCH NEXT FROM Employee_Cursor;
   END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO