在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条T_SQL 选择语句相关联,因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。

当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。

我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。
    
由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

每一个游标必须有四个组成部分这四个关键部分必须符合下面的顺序;

1.DECLARE 游标
2.OPEN 游标
3.从一个游标中FETCH 信息
4.CLOSE 或DEALLOCATE 游标

通常我们使用DECLARE 来声明一个游标声明一个游标主要包括以下主要内容:

游标名字
数据来源(表和列)
选取条件
属性(仅读或可修改)
其语法格式如下:

DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]

其中:
cursor_name 指游标的名字。

INSENSITIVE

表明MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。

游标指针示意图

详细:

1.定义一个标准游标:

declare mycursor cursor for select * from yuangong

2.定义一个只读游标:

declare mycursor cursor for select * from yuangong for read only

3.定义一个可写游标:

declare mycursor1 cursor for select * from yuangong for update of

姓名,性别,年龄,基本工资,奖金,所得税,应发工资
注: scroll 只能对只读游标起作用

4.打开游标:open 游标名

如:

declare mycursor cursor for select * from yuangong
open mycursor

5.从游标中取数据:fetch,默认情况下,指针指向第一条记录之前

移动记录指针的方法:
NEXT   下移一条记录
prior 上移一条记录
first 第一条记录
LAST   最后一条记录
absolute n 绝对记录 第N条记录

取数据语法:

fetch next|prior|first|last|absolute n    from 游标名 [into 变量名列表]

6.关闭游标: close 游标名
暂时关闭游标,还可再使用OPEN打开.

7.释放游标: deallocate 游标名

从内存中清除游标.如果还想使用,必须再次声明.

对当前游标状态进行判断:

8. @@fetch_status 如果返回是0,说明当前操作是成功的.否则是失败的.
0 FETCH 语句成功。
-1 FETCH 语句失败或此行不在结果集中。
-2 被提取的行不存在。

举例1:

利用游标从学生表中逐条读取所有数据:

declare @i INT
DECLARE @TN CHAR(8),@FU CHAR(20)
declare mycursor cursor for select sno,sname from student
open mycursor
select @i=count(*) from student
while @@fetch_status=0 and @i>1
BEGIN
    fetch next from mycursor INTO @TN,@FU
    set @i=@i-1
PRINT @TN + ' ' + @FU
END
close mycursor
deallocate mycursor

结果:
s1001    Jack Dong          
s1002    Lucy Dong          
s1003    Brezse Dong        
s1004    Andy Liu           
s1005    Jack Chen

举例2:

通过游标对读取的数据进行操作,并输出不同的结果:

declare @s_name varchar(20),@c_name VARCHAR(64),@sc_core int
declare my_cur cursor for select sname,cname,scgrade
from student s, course c, studentCourse sc WHERE s.sno=sc.sno AND c.cno=sc.cno
open my_cur
print space(27)+'2007年计算机专业考试系统'
fetch next from my_cur into @s_name,@c_name,@sc_core
while @@fetch_status=0
begin
    if @sc_core<60
    begin
        print space(20)+@s_name+ @c_name +':不及格 '
    end
    else
    begin
           if @sc_core >=60 and @sc_core <70
           begin
               print space(20)+@s_name  + @c_name +':及格 '
           end
           else
           begin
               if @sc_core>=70 and @sc_core<80
               begin
                  print space(20)+@s_name + @c_name +':良好'
               end
               else
               begin
                  print space(20)+@s_name + @c_name +':优秀'
               end
           end
    end
fetch next from my_cur into @s_name,@c_name,@sc_core
end
close my_cur
deallocate my_cur

结果:
                             2007年计算机专业考试系统
                    Jack Dong                               C++ 程序设计:及格
                    Jack Dong                               操作系统:良好
                    Lucy Dong                               C++ 程序设计:优秀
                    Lucy Dong                               计算机组成原理:良好
                    Brezse Dong                             C++ 程序设计:优秀
                    Brezse Dong                             面向对象的程序设计方法:不及格
                    Andy Liu                                操作系统:不及格
                    Andy Liu                                计算机组成原理:优秀

使用游标时应注意的问题:
 
(1) 尽管使用游标比较灵活,可以实现对数据集中单行数据的直接操作,但游标会在下面几个方面影响系统的性能:
-使用游标会导致页锁与表锁的增加
-导致网络通信量的增加
-增加了服务器处理相应指令的额外开销

(2) 使用游标时的优化问题:
-明确指出游标的用途:for read only或for update
-在for update后指定被修改的列

SQL SERVER 参考:游标(Cursor)的讲解与实例相关推荐

  1. SQL Server 中的身份认证讲解

    SQL Server 中的身份认证讲解TIME:2009-4-22   |   READ:228 Microsoft® SQL Server™ 可以在两种安全(身份验证)模式之一下工作: Window ...

  2. SQL Server 2012 无人值守安装(加入新实例)

    方法1,通过指定条个參数安装 setup.exe /Q /IACCEPTSQLSERVERLICENSETERMS /ACTION=install /PID=<validpid> /FEA ...

  3. SQL Server之游标的基础知识

    什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然 ...

  4. sql server 中游标详解

    目录 游标的定义 种类:(我也不太理解,有理解的@我) 游标的类型: 游标的实现 游标的实现功能 游标的使用的步骤: 游标的使用: 1.声明游标 游标的格式:(看了很多版本的格式说明, 这是最好理解的 ...

  5. SQL Server的游标

    SQL中的游标,可以用在过程或者作业中. Declare @eventid varchar(50)  Declare cur_name cursor for  select --Selectxxxxx ...

  6. 【译】SQL Server误区30日谈-Day7-一个实例多个镜像和日志传送延迟

    本系列文章是我在sqlskill.com的PAUL的博客看到的,很多误区都比较具有典型性和代表性,原文来自T-SQL Tuesday #11: Misconceptions about.... EVE ...

  7. 常用SQL Server 小语法、函数 等的实例汇总

    2019独角兽企业重金招聘Python工程师标准>>> 重点内容常用SQL Serve函数及语法的部分实例汇总 本文介绍SQL Server 中常用的几种函数: 函数一:ISNULL ...

  8. SQL Server之游标

    部分参考自:https://www.cnblogs.com/knowledgesea/p/3699851.html 一.什么是游标 游标是取用一组数据并能够一次与一个单独的记录进行交互的方法,可以定位 ...

  9. SQL Server数据库游标的应用

    目录 游标的概念 游标的作用 游标的生命周期 声明游标 打开一个游标 循环一个游标 关闭游标 释放游标 案例 游标的概念 游标是SQL 的一种数据访问机制.可以将游标简单的看成是查询的结果集的一个指针 ...

最新文章

  1. 浅谈权限设计(来自深空老大)
  2. 智能家居(草纲)v0.1
  3. 【重复制造精讲】报告点(Reporting Point)简介
  4. 深度学习-Tensorflow2.2-深度学习基础和tf.keras{1}-Tensorflow2.2-cpu/gpu环境安装-01
  5. 更极速:EdgeRoutine边缘程序
  6. Shell脚本语言与编译型语言的差异
  7. 不要仅仅依靠单元测试
  8. android 7.1 apk的systemuid [2]
  9. idea可以正常启动无法进入断点_IDEA Debug 无法进入断点的解决方法
  10. 【Python】ModuleNotFoundError: No module named 'pandas.io.data'
  11. Appium+Robotframework实现Android应用的自动化测试-3:一个必不可少的工具介绍
  12. 数字通信(知识点)复习
  13. 高效上网教程---如何免费下载全网中英文论文
  14. 命名实体识别难在哪?
  15. 传感器技术—新型光电传感器(学习笔记十 补充)
  16. 服务器未能识别是什么意思,服务器未能识别 HTTP 标头 SOAPAction 的值
  17. 蓝桥杯单片机学习记录——LED灯闪烁
  18. 华为的全闪存存储之路
  19. python蒙特卡洛算法模拟赌博模型
  20. lisp画垫圈_基于DCL和AutoLISP语言开发的垫圈标准件库

热门文章

  1. 归并排序概念及其实现
  2. 随机化快速排序+快速选择 复杂度证明+运行测试
  3. 【FPGA VerilogHDL】第一次尝试:LED灯基础实验
  4. 从思维图到基础再到深入,java空间查询
  5. 实验十一:图形界面二
  6. CCF 201809-1 买菜
  7. 2.PHP利用PDO连接方式连接mysql数据库
  8. Android 适配(一)
  9. 用solidity语言开发代币智能合约
  10. 21天学通Visual.Basic pdf