进阶技能篇:SQL中的while循环与游标

上一篇我们讲到SQL的存储过程和函数,本篇我们继续讲解进阶技能中重要知识点:while循环和游标的使用。

一、while循环:首先来看一段代码


 create table #temp1
 (xh   int) 

   declare @i  int 
   set @i=1
   while @i <= 80
   begin 
     insert into #temp1
     select @i
     set @i =@i+1
   end  

  select * from #temp1

释义 :

(1)首先创建个临时表#temp1,它只有一个字段xh;

(2)定义一个变量@i ,其类型为int ,并赋值为1 ;

(3)下来便是while 循环体了,其格式为:

while 条件
beign

end
主要意思就是,当while后面的条件满足时,便一直执行begin和end之间的语句,直到不满足while后面的条件。

结合上面的例子,就是当@i小于等于80时,一直执行下面的语句。

insert into #temp1
     select @i
  set @i =@i+1

这个insert into 前面基础篇讲过的,就是往临时表里插数据,也就是@i这个变量,然后紧接着,set @i =@i+1 就是让@i 自增。这句话很重要,没有这句话,程序就会陷入死循环。

这样综合起来,实现的结果就是,将数字1至80,循环插入表#temp。

(4)最后,我们看下表#temp的结果:
在这里插入图片描述
讲到这里,应该对while循环大致有个理解了吧,还没理解就翻回去再好好看看一下代码。

二、游标:

一开始其实没想讲这个游标,因为性能问题, 一般不推荐使用。但是考虑到项目上实际应用中可能会遇到,所以还是拿出来讲下。游标的循环机制,其实类似于while,但是语法不一样,还是以上边的#temp1表为例,我们再来一段例子:

 declare @xh  int 
 declare yb_cs cursor 
  for
  select xh from #temp1 --定义游标
  open yb_cs    ---打开游标
  fetch next from yb_cs into @xh --读取游标
  while (@@fetch_status=0)
  begin
   delete from #temp1  where xh=@xh and xh%7<>0 
   fetch next from yb_cs into @xh
   /**读取下一个游标:**/
  end
close yb_cs--关闭游标
deallocate yb_cs--删除游标

以上代码实现的效果,就是对#temp1表的数据进行逐条判断,将不能被7整除的数据delete掉,当然最简单的写法就是:

 delete from #temp1  where   xh%7<>0

但是此处主要目的是为了讲解游标的使用与理解,所以就拿这句话做个例子,实际项目中可能语句会复杂的多。

总结:

(1)while循环和游标都可以实现循环的目的,while用法比较简洁明了;

(2)游标是在while的基础上实现循环的功能,但是语法较复杂,且效率没有while高,所以一般不推荐使用;

(3)while循环体内支持再嵌套一个循环,但是一定要注意不能出现死循环,否则sql服务就会卡死、崩溃。

好了,以上就是今天的分析内容,喜欢的请收藏、点赞、转发,更多其他精彩知识,请查看本号历史文章。


版权声明:本文为m0_54999738原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。