mssql sqlserver 模拟for循环的写法

发布时间:2019-10-21  栏目:SQL  评论:0 Comments

转自:http://www.maomao365.com/?p=6567

用游标,和WHILE能够遍历您的查询中的每一条记下并将需要的字段传给变量进行对应的管理

DECLARE 
@A1 VARCHAR(10),
@A2 VARCHAR(10),
@A3 INT
DECLARE CURSOR YOUCURNAME FOR SELECT A1,A2,A3 FROM YOUTABLENAME
OPEN YOUCURNAME
fetch next from youcurname into @a1,@a2,@a3
while @@fetch_status<>-1
begin
update … set …=@a1,…=a2 …-a3 where

……您要施行的操作写在这里地
fetch next from youcurname into @a1,@a2,@a3
end
close youcurname
deallocate youcurname

—————————————

在应用程序开拓的时候,大家平日大概会遇上上边包车型大巴行使,大家会透过查询数据表的记录集,循环每一条记下,通过每一条的记录集对另一张表进行数量实行操作,如插入与立异,我们昨天若是有叁个如此的政工:老师为所在班级的学习者选课,选的教程如有工学、马克思主义政治文学、XXX观念概论、邓外公理论那么些课,现在操作重要如下:
1) 先要查询这么些还不曾结业的这么些学员的名单,完成学业之后的无计可施张开选课;
2) 在批量的挑选学生的还要,还索要加上对应的某一门科目;
3) 点增加后选课结束。
数据量少也许看不出用Java前后相继直接数十次拓宽数据库操作这种格局落到实处的劣点,因为它每一回在操作数据库的时候,都设有着频仍的和数据库的I/O直接互动,这一点质量的献身实属不该,那大家就看下边包车型地铁情势,通过存款和储蓄进度的游标方法来落到实处:建设构造存储进程:
Create PROCEDURE P_InsertSubject
@SubjectId int
AS
DECLARE rs CURSOR LOCAL SCROLL FOR
select studentid from student where StudentGradu = 1
OPEN rs
FETCH NEXT FROM rs INTO @tempStudentID
WHILE @@FETCH_STATUS = 0
BEGIN
Insert SelSubject values (@SubjectId,@tempStudentID)
FETCH NEXT FROM rs INTO @tempStudentID
END
CLOSE rs
Go
运用游标对记录集循环举行管理的时候平日操作如以下几个步骤:
1、把记录集传给游标;
2、展开游标
3、开始循环
4、从游标中取值
5、检查那生机勃勃行被再次回到
6、处理
7、关闭循环
8、关闭游标
下边这种措施在质量方面包车型地铁确已是增高广大了,但大家也想开,在存款和储蓄进度编写的时候,有的时候候大家尽量少的防止使用游标来进展操作,所以大家还足以对地点的积累进程进展改造,使用下边包车型地铁艺术来落到实处:
Create PROCEDURE P_InsertSubject
@SubjectId int
AS
declare @i int,
@studentid
DECLARE @tCanStudent TABLE
(
studentid int
,FlagID TINYINT
)
BEGIN
insert @tCanStudent select studentid,0 from student where StudentGradu =
1
SET @i=1
WHILE( @i>=1)
BEGIN
SELECT @studentid=’’
SELECT TOP 1 @studentid = studentid FROM @tCanStudent WHERE flagID=0
SET @i=@@ROWCOUNT
IF @i<=0 GOTO Return_Lab
Insert SelSubject values (@SubjectId,@studentid)
IF @@error=0
UPDATE @tCanStudent SET flagID=1 WHERE studentid = @studentid
Return_Lab:
END
End
GO
我们未来再来剖判以上那个蕴藏进程,它实现的措施是先把满意条件的记录集数据存放到一个表变量中,何况在这里个表变量中追加一个FLAGID举行数据初步值为0的贮存,然后去巡回那几个记录集,每循环一次,就把相应的FLAGID的值改成1,然后再依据循环来搜寻满足条件等于0的气象,能够看来,每循环一遍,管理的记录集就能少二回,然后循环的往选好课程表里面插入,直到记录集的条数为0时终止循环,此时完毕操作。
比较以上的二种循环方法的应用,就能够领会,不时候也许对于同样种效应大家得以达成的主意不一样,而最终应用程序品质的熏陶的歧异就能够十分大,第三种、第三种就大大的裁减的数据库交互I/O操作的一再,会节约点不清年华,方法三又防止用游标又足以节约不需要的耗费。

 

 

使用SQL的Agent能够实践布置任务,把写好的SQL语句放在安排职责里,能够达到规定的标准魔幻的效用,如定期备份数据,定时实践一定操作等等,当提到循环操作相当多条数据时,这里将要采纳游标了,当然SQL中也会有循环语句,如利用While。可是while的法力只能兑现日常的操作,游标的机能进一步强盛些,可在贰个点名的三个聚众内循环操作数据,达成动态操作,那就更牛了,呵呵,以下资料供存档用。

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
将招致退出到下几个外层循环。首先运行内层循环甘休将来的装有语句,然后下三个外层循环重复开端实践。

示例

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

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

多变量循环

CREATE      PROCEDURE my_FeeCount  AS
declare  @到期时间      char(10)
declare  @片区          char(20)
declare  @缴开销户数 char(10)
declare  @sql  char(2000)

declare  cur_data  cursor  for 
 select   convert(varchar(10),到期时间,120)  as 到期时间
,片区,count(distinct main_id) as  缴开支户数 
 from V_aipu_fee where
提交时间>=convert(varchar(10),getdate()-90,120) and
提交时间<convert(varchar(10),getdate()+1-90,120)
 and 收取金钱项目=’续费收取费用’
 Group   by   convert(varchar(10),到期时间,120),片区
 order   by   convert(varchar(10),到期时间,120) 
open  cur_data

fetch  next  from  cur_data  into  @到期时间,@片区,@缴耗费户数  
while(@@fetch_status  =  0) 
begin
        set @sql=’update
‘+RTHavalIM(@片区)+’实收=’+RTEvoqueIM(@片区)+’实收+’+RT昂科雷IM(@缴费客商数)+’ where
收取费用日期=”’+RTCRUISERIM(@到期时间)+””

 print @sql

 fetch  next  from  cur_data  into  @到期时间,@片区,@缴成本户数 
end

close  cur_data

摘要:

下文呈报sql脚本模拟for循环的写法,如下所示:

 /*
for样例
for('初始值','条件','执行后自增')
通过对for语句的结构分析,我们可以采用以下
while 结构来实现for循环,
--------------------------
初始值
while(条件)
begin
  执行后自增
end
--------------------------
例:使用while输出10的遍历
*/
declare @i int=1  --初始值
while (@i<=10) --条件
begin
  print '@i的值:'
  print @i
  set @i=@i+1 ---执行后自增
end

 

留下评论

网站地图xml地图