打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SQL Server游标语句 声明/打开/循环


网上搜到一篇介绍SqlServer数据库游标的用法,感觉言简意赅,粘过来跟大家分享一下:

SQL Server游标语句使用方法:

  1 --声明一个游标
  2 DECLARE MyCursor CURSOR
  3 FOR SELECT TOP 5 FBookName,FBookCoding FROM TBookInfo//定义一个叫MyCursor的游标,存放for select 后的数据
    
  5 --打开一个游标
  6 OPEN MyCursor//即打开这个数据集
    
  8 --循环一个游标
  9 DECLARE @BookName nvarchar(2000),@BookCoding nvarchar(2000)
 10 FETCH NEXT FROM  MyCursor INTO @BookName,@BookCoding//移动游标指向到第一条数据,提取第一条数据存放在变量中    
 11 WHILE @@FETCH_STATUS =0//如果上一次操作成功则继续循环
 12 BEGIN
 13 print 'name'+@BookName
 14 FETCH NEXT FROM  MyCursor INTO @BookName,@BookCoding//继续提下一行
 15 END
 16 
 17 --关闭游标
 18 CLOSE MyCursor
 19 --释放资源
 20 DEALLOCATE MyCursor
eg:
create table #a    
(    
id varchar(20),    
name varchar(20)  
)     
insert into #a select 1,'jack'    
insert into #a select 2,'join'    
insert into #a select 3,'make'  
declare mycursor cursor     
for select * from #a  
open mycursor     
declare @id varchar(20),@name varchar(20)    
fetch next from mycursor into @id,@name  
while @@fetch_status=0  
begin  
select @id,@name    
fetch next from mycursor into @id,@name    
end     
close mycursor    
deallocate mycursor

游标属于行级操作 消耗很大 SQL查询是基于数据集的所以一般查询能有 能用数据集 就用数据集 别用游标 数据量大 是性能杀手


SQL Server 2008 游标使用实例

本文使用以下两张数据库表作为演示对象。

游标初探--使用游标进行遍历

declare @classAndStudent table(  class_id int,                  --班级ID

  class_name nchar(10),          --班级名称

  teacher nchar(10),             --教师

  id int,                        --学生ID

  name nchar(10),                --学生名称

  age int                        --学生年龄

);

declare @ClassId int;                --班级ID

declare @ClassName nchar(10);        --班级名称

declare @Teacher nchar(10);          --教师

declare @Id int;                     --学生ID

declare @Name nchar(10);             --学生名称

declare @Age int;                    --学生年龄

insert into @classAndStudent   select t1.classid,t1.classname,t1.teacher,t2.id,t2.name,t2.age from tb_Class t1,tb_Student t2 where t1.classid =t2.classid

declare @cursor cursor;--游标

set @cursor=cursor for 

select class_id,class_name,teacher,id,name,age from @classAndStudent;	

open @cursor

fetch next from @cursor into @ClassId,@ClassName,@Teacher,@Id,@Name,@Age;

while @@FETCH_STATUS=0

begin

  if(@Age<20 and @Teacher='wsp')

  begin

     update tb_Student set classid=1 where id=@ID

  end

  fetch next from @cursor into @ClassId,@ClassName,@Teacher,@Id,@Name,@Age;


end

close @cursor

deallocate @cursor	



先简单解释一下上面代码到底做了些什么事。

代码一开始定义表类型变量@classAndStudent,用来保存学生与班级的信息,随后使用游标来遍历表变量(http://support.microsoft.com/?kbid=305977)@classAndStuden,在遍历过程中,将学生年龄小于20,且教师名称为“wsp”的学生的班级置为1

接下来,对游标的使用做简单的说明。



1)声明游标:确定游标的属性,制定游标的查询结果集。



declare @cursor cursor;--游标set @cursor=cursor for select class_id,class_name,teacher,id,name,age from @classAndStudent;


	

2)打开游标:编译sql server定义游标的select语句,并行成结果集。



open @cursor


3)获取数据:通过游标以行的单位从结果集中获取数据。



fetch next from @cursor into @ClassId,@ClassName,@Teacher,@Id,@Name,@Age;


4)关闭游标:停止处理查询。



close @cursor


5)释放游标:释放分配给游标的所有存储资源。



deallocate @cursor


查看执行结果:



select * from @classAndStudentselect * from tb_Student


结果为:

 

游标进阶--游标嵌套



简单修改上面的代码,即可以完成游标嵌套操作。

增加以下变量的声明。



declare @subcursor cursor;--子游标

declare @subClassID int;


修改if(@Age<20 and @Teacher='wsp')条件下的代码。



if(@Age<20 and @Teacher='wsp')

begin	

   set @subcursor=cursor for select t.class_id from tb_class t where t.class_id=@ClassId

   open @subcursor

   fetch next from @subcursor into @subClassID

   while @@FETCH_STATUS=0

   begin

     --逻辑部分

   fetch next from @subcursor into @subClassID

   end

   close @subcursor

   deallocate @subcursor

End


这里新增了一个游标@subcursor来遍历表tb_class的class_id。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
数据库:SQLServer中游标的用法笔记
sqlserver 游标全面解说
mysql 游标使用
sql_游标总结 - ASPNET技术交流 - IT数码 - 搜狐圈子
sql数据循环
SQL Server存储过程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服