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 循环将价格乘 2,然后选择最高价格。如果最高价格小于或等于 $500,则 WHILE 循环重新开始,并再次将价格乘 2。该循环不断地将价格乘 2,直到最高价格超过 $500,然后退出 WHILE 循环,并打印一条消息。

USE AdventureWorks2008R2;
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 AdventureWorks2008R2.HumanResources.Employee
WHERE JobTitle = 'Marketing Specialist';
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