上一篇我们讲到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服务就会卡死、崩溃。
好了,以上就是今天的分析内容,喜欢的请收藏、点赞、转发,更多其他精彩知识,请查看本号历史文章。