从零开始学SQLSERVER-游标CURSOR(基础)

导学

 游标算是SQLSERVER里面的进阶知识了,第一眼看了可能觉得复杂,这是正常的,但是其实游标有固定的格式,记住格式之后就简简单单了,让我们开始吧!

图片名称

游标的作用

 以前我们获取数据的方式是通过SELECT * FROM XX获取,而这样的结果是数据库一次性输出一张表,但是如果我们想要数据库一行一行的输出结果呢?
 这时候游标的作用就凸显出来了,游标可以让数据库一行一行的输出结果。但是我们用游标的根本原因并不是仅仅让它一行一行输出,我们可以在它逐行输出的同时,可以加上我们的处理,比如符合要求的行保留,不符合则剔除之类,而这就是游标的用法,而这就类似于对数据库查询结果的遍历。如果还不清楚我们可以继续往下看代码和例子。

图片名称

游标的代码

 游标的代码,第一次看很繁琐,但是实际上就是一个模板而已,用的时候复制一下就行,看一眼之后可以往下看例子。

DECLARE 游标名 CURSOR FOR       --这里声明游标,标注游标的名字
SELECT 列1,列2 FROM ...     --这个是游标处理的语句和数据源,也就是用游标对这个查询结果进行一行一行的处理。
OPEN 游标名                         --开启游标

DECLARE @变量1 变量类型 --用于接收游标的获取值,这里对应SQL语句中,获取的列的数量,获取几个列的数量就声明几个变量。
DECLARE @变量2 变量类型 --用于接收游标的获取值,这里对应SQL语句中,获取的列的数量,获取几个列的数量就声明几个变量。

FETCH NEXT FROM 游标名 INTO @变量1,@变量2 --游标开始遍历一行,并把数据保存到@变量1,@变量2,......中,这里的顺序需要对应select中列的顺序。
WHILE @@FETCH_STATUS = 0 -- @@FETCH_STATUS这个变量用于判断是否正常获取数据,如果能正常获取数据,则结果为0,则继续执行游标遍历语句,当数据获取异常的时候,结束遍历。
  BEGIN
    ... --这里用于对数据的处理,主要的数据判断处理操作就是在这里进行。
    FETCH NEXT FROM 游标名 INTO @变量1,@变量2 --游标继续遍历
  END

CLOSE 游标名       --关闭游标
DEALLOCATE 游标名  --删除游标

 上面的格式就是最简单的游标格式,也是最常用的游标格式,记住上面的就能解决大部分的问题,接下来我们继续进行讲解,同时介绍一些例子。

图片名称

游标的示例

先准备一张数据表

CREATE TABLE Students
(
name  VARCHAR(20) ,
class VARCHAR(20) ,--需要多少列,就添加多少行
)

INSERT INTO Students VALUES('张三', '五班')
INSERT INTO Students VALUES('李四', '四班')
INSERT INTO Students VALUES('王五', '一班')
name class
张三 五班
李四 四班
王五 一班

 需求:
 如果是五班的同学,则输出姓名,并标注为‘全英班’,不是五班的则输出名字并修改为‘传统班’。
 这时候我们用游标就可以这样处理:

DECLARE student_cursor CURSOR FOR --声明一个名字为student_cursor的游标
SELECT name,class from Students   --遍历的SQL语句
OPEN student_cursor              --打开游标
DECLARE   @name varchar(20)      --声明名字为name,类型为字符型的变量。
DECLARE   @class varchar(20)     --声明名字为class,类型为字符型的变量。
FETCH NEXT FROM student_cursor INTO @name,@class  --获取student_cursor的一条数据,其中为两个字段分别赋值给@name,@class
WHILE @@FETCH_STATUS=0 --假如检索到了数据继续执行游标,如果没有数据则判断失效,结束遍历
BEGIN
  IF @class = '五班' --判断,如果班级字段等于五班,则输出全英班,不等于则输出传统班
    PRINT('全英班')
  ELSE 
    PRINT('传统班')
  PRINT(@name) 
  FETCH NEXT FROM student_cursor INTO @name,@class --获取下一条数据并赋值给变量
END
CLOSE student_cursor      --关闭游标,但是还存在游标这个变量
DEALLOCATE student_cursor --删除游标

执行结果:

全英班
张三
传统班
李四
传统班
王五

 当你能成功理解和运行上述代码的时候,就说明你已经掌握了游标常用的使用场景,也掌握了SQLSERVER的一个高级语法。当然游标还有进阶的内容,也将在之后推出,如果有兴趣学习,可以继续留意,加油。

图片名称
原文地址:https://www.cnblogs.com/LY-CS/p/14441530.html