SQL循环语句 的写法 
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
在下例中,如果平均价格少于 $30WHILE 循环就将价格加倍,然后选择最高价。如果最高价少于或等于 $50WHILE 循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过 $50,然后退出 WHILE 循环并打印一条消息。

USE pubs
sql语句实现的四种功能
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) 后将执行 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
C.延伸
--定义变量:
declare @A1 INT,@A2 INT,@A3 INT
--定义游标
DECLARE my_Cur CURSOR FOR
SELECT A1,A2,A3 FROM A
--打开游标
OPEN  my_Cur
--游标滚到下一行
FETCH NEXT FROM  my_Cur INTO @A1,@A2,@A3
--循环直到游标逐行读取完数据
WHILE @@FETCH_STATUS = 0
BEGIN
  /*
  --这里做你想做的事情
  --请问
  print  @A1+@A2+@A3
  --怎么实现,谢谢
  */
  --游标滚到下一行
  FETCH NEXT FROM  my_Cur INTO @A1,@A2,@A3
END
--关闭游标
CLOSE my_Cur
--释放资源
DEALLOCATE my_Cur
如何在SQL中使用循环结构
解答 FOR,LOOP,WHILE,REPEATUDB/400的一种内部循环控制,用于遍历表中符合条件的每一行记录。
例如:
目的:更新employee库,把所有北京籍员工的工资提高10%
例一:使用FOR循环
--------------------------------------------
CREATE PROCEDURE QGPL/TEST_FOR
LANGUAGE SQL
BEGIN
FOR each_record AS
---cur01 CURSOR FOR
------SELECT * FROM code,salary,city from employee where city="Beijing"
---------DO
------------UPDATE employee
------------SET salary=salary * 1.1
------------WHERE CURRENT OF cur01;
ENDFOR;
END;
例二:使用LOOP循环
-
---------------------------------------
CREATE PROCEDURE QGPL/TEST_LOOP
LANGUAGE SQL
BEGIN
DECLARE code_v char(10);
DECLARE salary_v integer;
DECLARE city_v char(20);
DECLARE C1 CURSOR FOR
---SELECT code,salary,city FROM employee WHERE city="Beijing";
OPEN C1;
loop_label:
LOOP
- FETCH C1 INTO code_v,salary_v,city_v;
--IF SQLCODE=0 THEN
------SET salary_v=salary_v*1.1;
-
-----UPDATE employee SET salary=salary_v
---------WHERE CURRENT OF C1;
--ELSE
------LEAVE loop_label;
--END IF;
END LOOP loop_label;
CLOSE C1;
END;
例三:使用WHILE循环
---------------------------------------
CREATE PROCEDURE QGPL/TEST_WHILE
LANGUAGE SQL
BEGIN
DECLARE code_v char(10);
DECLARE salary_v integer;
DECLARE city_v char(20);
DECLARE at_end integer;
DECLARE C1 CURSOR FOR
---SELECT code,salary,city FROM employee WHERE city="Beijing";
OPEN C1;
SET at_end=0;
WHILE at_end = 0 DO
--FETCH C1 INTO code_v,salary_v,city_v;
--IF SQLCODE=0 THEN
------SET salary_v=salary_v*1.1;
------UPDATE employee SET salary=salary_v
---------WHERE CURRENT OF C1;
--ELSE
------SET at_end=1;
-
-END IF;
END WHILE;
CLOSE C1;
END;
例四:使用REPEAT循环
------------------------------------------------
CREATE PROCEDURE QGPL/TEST_REPEAT
LANGUAGE SQL
BEGIN
DECLARE code_v char(10);
DECLARE salary_v integer;
DECLARE city_v char(20);
DECLARE C1 CURSOR FOR
---SELECT code,salary,city FROM employee WHERE city="Beijing";
OPEN C1;
repeat_label:
REPEAT
--FETCH C1 INTO code_v,salary_v,city_v;
--IF SQLCODE=0 THEN
------SET salary_v=salary_v*1.1;
------UPDATE employee SET salary=salary_v
---------WHERE CURRENT OF C1;
--END IF;
--UNTIL SQLCODE<>0;
END REPEAT repeat_loop;
CLOSE C1;
END;
总结:四种循环结构实现的功能基本相同,用户可以根据自己的习惯选择使用。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。