前言
大家都对SqlServer视图、存储过程、触发器的创建与使用有一定的了解了,我们来看下什么是游标,怎么使用,什么时候用。
什么是游标
1、游标的概念
2、游标的组成
3、游标的分类
API服务器游标
Transaction-SQL游标
客户端游标
怎么使用游标
游标的生命周期包含有五个阶段,也是它使用的顺序:
- 声明游标(创建);
- 打开游标;
- 读取游标数据;
- 关闭游标;
- 释放游标。
1、声明游标
--声明(创建)游标对象(标准游标) declare MyCursor cursor for SELECT s.Name,sc.ClassName FROM a_Students s INNER JOIN a_StudentClass sc ON s.ClassId=sc.ClassId;
2、打开游标对象
游标对象创建之后,必须打开之后才能进行使用,使用关键字open。
--打开游标 open MyCursor;
3、读取游标数据
--读取游标数据 --声明两个变量接收从游标中取出的值 declare @Name varchar(50),@ClassName varchar(50); --移动游标取值 fetch next from MyCursor into @Name,@ClassName; print(@Name); print(@ClassName);
4、关闭游标
--关闭游标 CLOSE MyCursor
5、释放游标
--释放游标 DEALLOCATE MyCursor
6、修改游标数据
--修改当前游标数据 --a_Students表名,Name字段名,MyCursor游标名 UpDate a_Students Set Name = '孙悟空111' Where CURRENT Of MyCursor;
7、删除游标数据
--删除当前游标数据 --a_Students表名 Delete From a_Students Where Current Of MyCursor
完整实例
使用游标查询数据,只获取取字段姓名(Name),和字段班级(ClassName)
--声明(创建)游标对象(标准游标) declare MyCursor cursor for SELECT s.Name,sc.ClassName FROM a_Students s INNER JOIN a_StudentClass sc ON s.ClassId=sc.ClassId; --声明两个变量接收从游标中取出的值 declare @Name varchar(50),@ClassName varchar(50); begin --打开游标 open MyCursor; --移动游标取值 fetch next from MyCursor into @Name,@ClassName; --这里对游标的状态进行判断,如果为0,证明游标中有值 while @@FETCH_STATUS = 0 BEGIN print(@Name); print(@ClassName); --让游标继续往后移动 fetch next from MyCursor into @Name,@ClassName end --关闭游标 CLOSE MyCursor --释放游标 DEALLOCATE MyCursor end
什么时候使用游标
当你要处理的结果集比较庞大,而你要对某一行或几行进行操作的时候,要考虑使用游标。
特别是对结果集中第几行进行行操作的时候,一般可以考虑使用游标。
但也不是唯一的方法,可以利用别的方法来替代,一般比较复杂的存储过程里面会出现游标的影子。
- 现存系统有一些游标,我们查询必须通过游标来实现
- 作为一个备用方式,当我们穷尽了while循环,子查询,临时表,表变量,自建函数或其他方式扔来无法实现某些查询的时候,使用游标实现.
游标使用的建议
游标用于按顺序遍历结果集。
但一般情况下,应尽量避免使用游标。
原因:
- 游标违背了关系模型,即按集合来考虑问题的思想;
- 游标逐行对纪录进行操作,会带来额外的开销,使用游标的解决方案通常比使用集合的解决方案要慢得多;
- 使用游标的解决方案,需要用很多代码来描述对游标的操作,因此代码更长,可读性更差,也更难以维护。
如果要使用,一定记住要记住:
- 用完之后一定要关闭和释放,尽量不要在大量数据上定义游标;
- 尽量不要使用游标上更新数据;
- 尽量不要使用insensitive, static和keyset这些参数定义游标;
- 如果可以,尽量使用FAST_FORWARD关键字定义游标;
- 如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数。
我们就介绍到这里吧,各位拜了个拜。