编程小技巧
P  R  O  G  R  A  M  M  I  N  G    T  I  P  S
SQL循环语句
declare  @i  int
set  @i=1
while  @i<30
begin
insert  into  test  (userid)  values(@i)
set  @i=@i+1
end

---------------

while  条件
begin
执行操作
set  @i=@i+1
end

WHILE
设置重复执行  SQL  语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用  BREAK  和  CONTINUE  关键字在循环内部控制  WHILE  循环中语句的执行。

语法
WHILE  Boolean_expression
{  sql_statement  |  statement_block  }
[  BREAK  ]
{  sql_statement  |  statement_block  }
[  CONTINUE  ]

参数
Boolean_expression

返回  TRUE  或  FALSE  的表达式。如果布尔表达式中含有  SELECT  语句,必须用圆括号将  SELECT  语句括起来。

{sql_statement  |  statement_block}

Transact-SQL  语句或用语句块定义的语句分组。若要定义语句块,请使用控制流关键字  BEGIN  和  END。

BREAK

导致从最内层的  WHILE  循环中退出。将执行出现在  END  关键字后面的任何语句,END  关键字为循环结束标记。

CONTINUE

使  WHILE  循环重新开始执行,忽略  CONTINUE  关键字后的任何语句。

注释
如果嵌套了两个或多个  WHILE  循环,内层的  BREAK  将导致退出到下一个外层循环。首先运行内层循环结束之后的所有语句,然后下一个外层循环重新开始执行。

示例
A.  在嵌套的  IF...ELSE  和  WHILE  中使用  BREAK  和  CONTINUE
在下例中,如果平均价格少于  $30,WHILE  循环就将价格加倍,然后选择最高价。如果最高价少于或等于  $50,WHILE  循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过  $50,然后退出  WHILE  循环并打印一条消息。

USE  pubs
GO
WHILE  (SELECT  AVG(price)  FROM  titles)  <  $30
BEGIN
UPDATE  titles
SET  price  =  price  *  2
SELECT  MAX(price)  FROM  titles
IF  (SELECT  MAX(price)  FROM  titles)  >  $50
BREAK
ELSE
CONTINUE
END
PRINT  'Too  much  for  the  market  to  bear'

B.  在带有游标的过程中使用  WHILE
以下的  WHILE  结构是名为  count_all_rows  过程中的一部分。下例中,该  WHILE  结构测试用于游标的函数  @@FETCH_STATUS  的返回值。因为  @@FETCH_STATUS  可能返回  –2、-1  或  0,所以,所有的情况都应进行测试。如果某一行在开始执行此存储过程以后从游标结果中删除,将跳过该行。成功提取  (0)  后将执行  BEGIN...END  循环内部的  SELECT  语句。

USE  pubs
DECLARE  tnames_cursor  CURSOR
FOR
SELECT  TABLE_NAME
FROM  INFORMATION_SCHEMA.TABLES
OPEN  tnames_cursor
DECLARE  @tablename  sysname
--SET  @tablename  =  'authors'
FETCH  NEXT  FROM  tnames_cursor  INTO  @tablename
WHILE  (@@FETCH_STATUS  <>  -1)
BEGIN
IF  (@@FETCH_STATUS  <>  -2)
BEGIN  
SELECT  @tablename  =  RTRIM(@tablename)
EXEC  ('SELECT  '''  +  @tablename  +  '''  =  count(*)  FROM  '
+  @tablename  )
PRINT  '  '
END
FETCH  NEXT  FROM  tnames_cursor  INTO  @tablename
END
CLOSE  tnames_cursor
DEALLOCATE  tnames_cursor
版权所有:敏捷生产管理软件@2021 电子邮件:fengdiy@163.com 粤ICP备19119317号