sql循环语句的写法.docx
《sql循环语句的写法.docx》由会员分享,可在线阅读,更多相关《sql循环语句的写法.docx(8页珍藏版)》请在冰点文库上搜索。
sql循环语句的写法
sql循环语句的写法
SQL循环语句
declare@iint
set@i=1
while@i<30
begin
insertintotest(userid)values(@i)
set@i=@i+1
end---------------while条件
begin
执行操作
set@i=@i+1
endWHILE
设置重复执行SQL语句或语句块的条件。
只要指定的条件为真,就重复执行语句。
可以使用BREAK和CONTINUE关键字在循环内部控制WHILE循环中语句的执行。
语法
WHILEBoolean_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循环并打印一条消息。
USEpubs
GO
WHILE(SELECTAVG(price)FROMtitles)<$30
BEGIN
UPDATEtitles
SETprice=price*2
SELECTMAX(price)FROMtitles
IF(SELECTMAX(price)FROMtitles)>$50
BREAK
ELSE
CONTINUE
END
PRINT'Toomuchforthemarkettobear'B.在带有游标的过程中使用WHILE
以下的WHILE结构是名为count_all_rows过程中的一部分。
下例中,该WHILE结构测试用于游标的函数@@FETCH_STATUS的返回值。
因为@@FETCH_STATUS可能返回–2、-1或0,所以,所有的情况都应进行测试。
如果某一行在开始执行此存储过程以后从游标结果中删除,将跳过该行。
成功提取(0)后将执行BEGIN...END循环内部的SELECT语句。
USEpubs
DECLAREtnames_cursorCURSOR
FOR
SELECTTABLE_NAME
FROMINFORMATION_SCHEMA.TABLES
OPENtnames_cursor
DECLARE@tablenamesysname
--SET@tablename='authors'
FETCHNEXTFROMtnames_cursorINTO@tablename
WHILE(@@FETCH_STATUS<>-1)
BEGIN
IF(@@FETCH_STATUS<>-2)
BEGIN
SELECT@tablename=RTRIM(@tablename)
EXEC('SELECT'''+@tablename+'''=count(*)FROM'
+@tablename)
PRINT''
END
FETCHNEXTFROMtnames_cursorINTO@tablename
END
CLOSEtnames_cursor
DEALLOCATEtnames_cursor
C.延伸:
--定义变量:
declare@A1INT,@A2INT,@A3INT
--定义游标
DECLAREmy_CurCURSORFOR
SELECTA1,A2,A3FROMA
--打开游标
OPENmy_Cur
--游标滚到下一行
FETCHNEXTFROMmy_CurINTO@A1,@A2,@A3
--循环直到游标逐行读取完数据
WHILE@@FETCH_STATUS=0
BEGIN
/*
--这里做你想做的事情
--请问
print@A1+@A2+@A3
--怎么实现,谢谢
*/
--游标滚到下一行
FETCHNEXTFROMmy_CurINTO@A1,@A2,@A3
END
--关闭游标
CLOSEmy_Cur
--释放资源
DEALLOCATEmy_Cur
如何在SQL中使用循环结构
解答FOR,LOOP,WHILE,REPEAT是UDB/400的一种内部循环控制,用于遍历表中符合条件的每一行记录。
例如:
目的:
更新employee库,把所有北京籍员工的工资提高10%
例一:
使用FOR循环
--------------------------------------------
CREATEPROCEDUREQGPL/TEST_FOR
LANGUAGESQL
BEGIN
FOReach_recordAS
---cur01CURSORFOR
------SELECT*FROMcode,salary,cityfromemployeewherecity="Beijing"
---------DO
------------UPDATEemployee
------------SETsalary=salary*1.1
------------WHERECURRENTOFcur01;
ENDFOR;
END;
例二:
使用LOOP循环
----------------------------------------
CREATEPROCEDUREQGPL/TEST_LOOP
LANGUAGESQL
BEGIN
DECLAREcode_vchar(10);
DECLAREsalary_vinteger;
DECLAREcity_vchar(20);
DECLAREC1CURSORFOR
---SELECTcode,salary,cityFROMemployeeWHEREcity="Beijing";
OPENC1;
loop_label:
LOOP
-FETCHC1INTOcode_v,salary_v,city_v;
--IFSQLCODE=0THEN
------SETsalary_v=salary_v*1.1;
------UPDATEemployeeSETsalary=salary_v
---------WHERECURRENTOFC1;
--ELSE
------LEAVEloop_label;
--ENDIF;
ENDLOOPloop_label;
CLOSEC1;
END;
例三:
使用WHILE循环
---------------------------------------
CREATEPROCEDUREQGPL/TEST_WHILE
LANGUAGESQL
BEGIN
DECLAREcode_vchar(10);
DECLAREsalary_vinteger;
DECLAREcity_vchar(20);
DECLAREat_endinteger;
DECLAREC1CURSORFOR
---SELECTcode,salary,cityFROMemployeeWHEREcity="Beijing";
OPENC1;
SETat_end=0;
WHILEat_end=0DO
--FETCHC1INTOcode_v,salary_v,city_v;
--IFSQLCODE=0THEN
------SETsalary_v=salary_v*1.1;
------UPDATEemployeeSETsalary=salary_v
---------WHERECURRENTOFC1;
--ELSE
------SETat_end=1;
--ENDIF;
ENDWHILE;
CLOSEC1;
END;
例四:
使用REPEAT循环
------------------------------------------------
CREATEPROCEDUREQGPL/TEST_REPEAT
LANGUAGESQL
BEGIN
DECLAREcode_vchar(10);
DECLAREsalary_vinteger;
DECLAREcity_vchar(20);
DECLAREC1CURSORFOR
---SELECTcode,salary,cityFROMemployeeWHEREcity="Beijing";
OPENC1;
repeat_label:
REPEAT
--FETCHC1INTOcode_v,salary_v,city_v;
--IFSQLCODE=0THEN
------SETsalary_v=salary_v*1.1;
------UPDATEemployeeSETsalary=salary_v
---------WHERECURRENTOFC1;
--ENDIF;
--UNTILSQLCODE<>0;
ENDREPEATrepeat_loop;
CLOSEC1;
END;
总结:
四种循环结构实现的功能基本相同,用户可以根据自己的习惯选择使用。