一只努力学习的程序猿

一只努力学习的程序猿

前言

大家都对SqlServer视图、存储过程、触发器的创建与使用有一定的了解了,我们来看下什么是游标,怎么使用,什么时候用。

SqlServer视图的创建与使用

SqlServer存储过程的创建与使用

SqlServer触发器的创建与使用


什么是游标

1、游标的概念

2、游标的组成

3、游标的分类

API服务器游标

Transaction-SQL游标

客户端游标


怎么使用游标

游标的生命周期包含有五个阶段,也是它使用的顺序:

  1. 声明游标(创建);
  2. 打开游标;
  3. 读取游标数据;
  4. 关闭游标;
  5. 释放游标。

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

什么时候使用游标

当你要处理的结果集比较庞大,而你要对某一行或几行进行操作的时候,要考虑使用游标。

特别是对结果集中第几行进行行操作的时候,一般可以考虑使用游标。

但也不是唯一的方法,可以利用别的方法来替代,一般比较复杂的存储过程里面会出现游标的影子。

  1. 现存系统有一些游标,我们查询必须通过游标来实现
  2. 作为一个备用方式,当我们穷尽了while循环,子查询,临时表,表变量,自建函数或其他方式扔来无法实现某些查询的时候,使用游标实现.

游标使用的建议

游标用于按顺序遍历结果集。

但一般情况下,应尽量避免使用游标。

原因:

  1.  游标违背了关系模型,即按集合来考虑问题的思想;
  2. 游标逐行对纪录进行操作,会带来额外的开销,使用游标的解决方案通常比使用集合的解决方案要慢得多;
  3. 使用游标的解决方案,需要用很多代码来描述对游标的操作,因此代码更长,可读性更差,也更难以维护。

如果要使用,一定记住要记住:

  1. 用完之后一定要关闭和释放,尽量不要在大量数据上定义游标;
  2. 尽量不要使用游标上更新数据;
  3. 尽量不要使用insensitive, static和keyset这些参数定义游标;
  4. 如果可以,尽量使用FAST_FORWARD关键字定义游标;
  5. 如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数。

我们就介绍到这里吧,各位拜了个拜。

04-09 04:30