2、打开游标对象
打开游标使用Open语句用于打开Transaction-SQL服务器游标,执行Open语句的过程中就是按照Select语句进行填充数据,打开游标以后游标位置在第一行。
打开游标
全局游标:Open Global MyCursor 局部游标: Open MyCursor
游标对象创建之后,必须打开之后才能进行使用,使用关键字open。
--打开游标 open MyCursor;
3、读取游标数据
在打开游标以后,使用Fetch语句从Transaction-SQL服务器游标中检索特定的一行。使用Fetch操作,可以使游标移动到下一个记录,并将游标返回的每个列得数据分别赋值给声明的本地变量。
Fetch [Next | Prior | First | Last | Absolute n | Relative n ] From MyCursor
Into @GoodsID,@GoodsName
其中:Next表示返回结果集中当前行的下一行记录,如果第一次读取则返回第一行。默认的读取选项为Next
Prior表示返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。
First表示返回结果集中的第一行,并且将其作为当前行。
Last表示返回结果集中的最后一行,并且将其作为当前行。
Absolute n 如果n为正数,则返回从游标头开始的第n行,并且返回行变成新的当前行。如果n为负,则返回从游标末尾开始的第n行,并且返回行为新的当前行,如果n为0,则返回当前行。
Relative n 如果n为正数,则返回从当前行开始的第n行,如果n为负,则返回从当前行之前的第n行,如果为0,则返回当前行。
--读取游标数据 --声明两个变量接收从游标中取出的值 declare @Name varchar(50),@ClassName varchar(50); --移动游标取值 fetch next from MyCursor into @Name,@ClassName; print(@Name); print(@ClassName);
4、关闭游标
游标使用完毕之后需要关闭,以及资源的释放,关键字close,deallocate。
--关闭游标 CLOSE MyCursor
5、释放游标
游标使用完毕之后需要关闭,以及资源的释放,关键字close,deallocate。
--释放游标 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参数。
我们就介绍到这里吧,各位拜了个拜。