WHELI语句根据条件表达式设置Transact-SQL语句或yu'j语句块重复执行的次数。如果所设置的条件为真(True),在WHILE循环体内的Transact-SQLyu'j语句会一直重复执行,直到条件为假(False)为止。在WHILE循环体内Transact-SQL语句的执行可以使用使用BREAK与CONTINUE关键词来控制。
WHILE循环语句的语法格式如下:
WHILE boolean_epression
{sql_statement|statement_block}
[BREAK]
[sql_statement|statement_block]
[CONTINUE]
ge'x各选项的含义如下:
(1)boolean_epression返回值为TRUE或FALSE。如果g该表达式含有SELECT语句,必须用圆括号将SELECT语句括起来。
(2){sql_statement|statement_block}为Transact-SQL语句或语句块。语句块din定义应使用控制流关键字BEGIN和END。
(3)BREAK导致从最内层的WHILExu循环中退出。将执行出现在END关键字ho后面的任何语句,END关键字为循环结束标记。
(4)CONTINUE使WHILE循环重新开始执行,忽略CONTINUE关键字后的任何语句。
在WHILE循环中,zhi只要boolean_expression的条件为True,就会重复执行循环体内语句或语句块
举例:将goods表中库存数最大的商品每次订购两件,计算需要多少次这样的订购才能使库存数不够一次订购。
DECLARE @count int,@maxstockid char(6),@maxstock float
set @count=0
set @maxstock=(SELECT max(stock_quantity) from goods)
set @maxstockid=(SELECT goods_id FROM goods where stock_quantity=@maxstock)
SELECT @maxstockid,@maxstock
WHILE(@maxstock>(SELECT order_quantity FROM goods WHERE goods_id=@maxstockid))
BEGIN
UPDATE goods
SET order_quantity=order_quantity+2
WHERE goods_id=@maxstockid
set @count=@count+1
END
SELECT @count
运行结果如下:
8
本例中,@count变量存储ding订购次数,初始化为0;@maxstock为最大库存数,@maxstockid为最大库存数所在记录的商品编码,使用SELECT语句赋值。WHILE的循环条件是判断编号为@maxstockid的商品的的订购数order_quantity是否小于@maxstock,是则在循环体中geng更新order_quantity,使之每次循环加数值2,并且@count加1,表示进行一次订购;否则退出xu循环。循环体是是由BEGIN..........END定义的语句块。
可以使用BREAK或CONTINUE语句控制WHILExun循环体内语句的zhi'执行。BREAK语句让chen程序跳出循环,CONTINUE语句让程序跳过CONTINUE命令之后的语句,回到WHILE循环的第一行命令,重新开始循环。
举例:
对于goods表,如果平均库存小于12,WHILE循环就将各记录库存增加5%,再判断最高库存是否少于或等于25,是则WHILE循环重新启动并再次将各记录库存增加5%。当循环不断地将库存增加直到最高库存超过25时,然后退出WHILE循环。在WHILE中使用BREAK或CONTINUEkong控制循环体的执行。
/*执行循环,直到库存平均值超过12*/
WHILE(SELECT avg(stock_quantity) FROM goods)<12
BEGIN
UPDATE goods
SET stock_quantity=stock_quantity*1.05
SELECT max(stock_quantity) FROM goods
/*如果最大库存值超过25,则用BREAK退出WHILE循环,否则继续循环*/
IF (SELECT max(stock_quantity) FROM goods)>25
BEGIN
PRINT'库存太多了'
BREAK
END
ELSE
CONTINUE
END
如果程序嵌套了两个或多个WHILE循环,内层的BREAK将导致退出到下一个外层循环。运行完内层循环之后的所有语句后,重新执行下一个外层循环。
举例:
计算s=1!+2!+........+10!
DECLARE @s int ,@n int ,@t int ,@c int
/*@s存储阶乘和,@n为外层循环控制变量,@c为内层循环控制变量,@t为@c的阶乘值*/
SET @s=0
SET @n=1
WHILE @n<=10
BEGIN
SET @c=1
SET @t=1
WHILE @c<=10
BEGIN
SET @t=@t*@c
SET @c=@c+1
END
SET @S=@s+@t
SET @n=@n+1
END
SELECT @s,@c
本例中,设计了两层WHILE循环,内层WHILE计算@n(@n取直为1~10)的阶乘,外层WHILE将每次内层WHILE计算出来@n的阶乘累加到@s变量,同时控制内层@n的值,每循环一次,使@n的值加1。这里@n的作用包括两个方面:一方面时作为外层循环次数的控制变量,当表达式为@n<=10成立时,即执行循环,使循环次数控制在10次,当条件不成立时,退出循环;另一方面,@n作为内层循环的终值,用于计算@n的阶乘。外层WHILE每循环一次,内层WHILE循环@n次。