文章目录

  • 一 、概述
    • 1-1 游标基本概念
    • 1-2 游标的实现功能及使用步骤
  • 二、语法 T-SQL
    • 1-1 声明游标
    • 1-2 打开游标
    • 1-3 读取游标
    • 1-4 关闭游标
    • 1-5 删除游标
  • 三、 创建举例用的数据库及表

一 、概述

1-1 游标基本概念

什么是游标

游标是一种处理数据的方法,具有对结果集进行逐行处理的能力。

可以将游标看作一种特殊的指针,它与某个查询结果集相关联,可以指向结果集的任意位置,可以将数据放在数组、应用程序中或其他的地方,允许用户对指定位置的数据进行处理。

为什么使用游标

  • 出来 SELECT 的 WHERE 可以限制一条记录被选中外,T-SQL 没有提供查询表中单条记录的方法,但我们常常会遇到需要逐行读取记录的情况。
  • 应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序往往采取非数据库语言(如 C#、VB、ASP或其他开发工具)内嵌T-SQL的形式来开发,而这些非数据库语言无法将表作为一个单元来处理,因此,这些应用程序需要一种机制以便每次处理一行或一部分行。

1-2 游标的实现功能及使用步骤

游标的实现功能

  • 允许对 SELECT 返回的表中的每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;
  • 从表中的当前位置检索一行或多行数据;
  • 游标允许应用程序对当前位置的数据进行修改、删除的能力;
  • 对于不同用户对结果集包含的数据所做的修改,支持不同的可见性级别;
  • 提供脚本、存储过程、触发器中用于访问结果集中的数据的语句。

游标的使用步骤:前4个步骤是必须的。

  • 声明游标 DECLARE:将游标与 T-SQL 语句的结果集相关联,并定义游标的名称、类型和属性,如游标中的记录是否可以更新、删除
  • 打开游标 OPEN:执行 T-SQL 语句以填充数据。
  • 读取游标 FETCH:从游标的结果集中检索想要查看的行,进行逐步操作。
  • 关闭游标 CLOSE:停止游标使用的查询,但并不删除游标的定义,可以使用 OPEN 再次打开。
  • 释放游标 DEALLOCATE:删除资源并释放其占用的所有资源。

二、语法 T-SQL

1-1 声明游标

声明游标是指用 DECLARE 语句创建一个游标。声明游标主要包括以下内容:游标名称、数据来源、选取条件和属性。

声明游标语法格式

DECLARE 游标名称 CURSOR
[ LOCAL | GLOBAL ]                                   --游标的作用域
[ FORWORD_ONLY | SCROLL ]                            --游标的移动方向
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]         --游标的类型
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]            --游标的访问类型
[ TYPE_WARNING]                                      --类型转换警告语句
FOR SELECT 语句                                      --SELECT查询语句
[ FOR { READ ONLY | UPDATE [OF 列名称]}][,...n]      --可修改的列

举例:
要求:创建游标 curl,使 curl 可以对 student 表所有的数据进行操作,并将游标变量 @var_curl 与 curl相关联。

声明游标 T-SQL 语句

-- 声明游标
DECLARE curl CURSOR
FOR SELECT * FROM student
DECLARE @var_curl CURSOR
SET @var_curl=curl

1-2 打开游标

游标声明后,如果要从游标中读取数据必须要打开游标。打开游标是指打开已经声明但尚未打开的游标,并执行游标中定义的查询。

  • 如果声明游标使用 STATIC 类型,则 打开游标时产生一个临时表来存放结果集;
  • 如果声明游标使用 KEYSET 类型,则 OPEN 产生一个临时表来存放键值。
  • 所有的临时表都存放在 tempdb 数据库中。

打开游标语法格式

OPEN 游标名称

在游标被成功打开后,全局 变量 @@CORSOR_ROWS 用来记录游标内的数据行数。返回值有四种:

返回值 描述
-m 表示仍在从基础表向游标读入数据,m表示当前在游标中的数据行数
-1 该游标是一个动态游标,其返回值无法确定
0 无符合调剂的记录或游标已经关闭
n 从基础表向游标读入数据已结束,n 为游标中已有的数据记录行数

举例:
要求:创建游标 curl,使 curl 可以对 student 表所有的数据进行操作,然后打开该游标,输出游标中的行数。

打开游标 T-SQL 语句

-- 打开 curl 游标
OPEN curl
SELECT '游标curl数据行数' =@@CURSOR_ROWS

执行结果

1-3 读取游标

当游标打开后就可以使用 FETCH 命令从游标中逐行地读取数据,以进行相关处理。

读取游标语法格式

FETCH
[[ NEXT | PRIOR | FIRST | LAST | ABSOLUTE{n|@nvar }| RELATIVE { n|@nvar }] FROM ]  -- 读取数据的位置
{{[ GLOBAL] 游标名称} | @游标变量名称 }
[ INTO @游标变量名称 ][,...n]                                                       -- 将读取的游标数据存放到指定变量中

FETCH语句执行时,可以使用 全局变量 @@FETCH_STATUS 返回上次执行 FETCH 命令的状态。在每次用 fetch 从游标中读取数据时,都应检查该变量,以确定上次 FETCH操作是否成功,来决定如何进行下一步处理。返回值有三种:

返回值 描述
0 FETCH命令被成功执行
1 FETCH命令失败或者行数据超过游标数据结果集的范围
2 所读取的数据已经不存在

举例:
要求:创建游标 curl,从游标中提取数据,并查看 FETCH 命令的执行状态。

读取游标 T-SQL 语句

-- 读取curl 数据
FETCH NEXT FROM curl
SELECT 'NEXT_FETCH执行情况'=@@FETCH_STATUS

执行结果

1-4 关闭游标

游标使用完以后要及时关闭。关闭游标使用 CLOSE ,但不释放游标占用的资源。

关闭游标语法格式

CLOSE {{[ GLOBAL] 游标名称} | @游标变量名称 }

举例:
要求:关闭游标 curl。

关闭游标 T-SQL 语句

-- 关闭游标
CLOSE curl

1-5 删除游标

游标关闭后定义还在,需要时可以再使用 OPEN 打开游标继续使用。若确定不再使用则使用 CLOSE 删除游标,释放占用系统中的资源。

删除游标语法格式

DEALLOCATE {{[ GLOBAL] 游标名称} | @游标变量名称 }

举例:
要求:删除游标 curl。

关闭游标 T-SQL 语句

-- 删除游标
DEALLOCATE curl

三、 创建举例用的数据库及表

创建举例用的数据

  1. 创建StuInfo数据库,若存在则直接使用
  2. 创建student表,若已存在删除后创建
  3. 插入数据

可以将下方SQL语句 复制到 SSMS 工具上直接执行,如果有时间,建议自己敲一遍。扩展一点,SQL语句关键字最好使用大写。如果使用小写,数据库会将关键字从小写转换为大写,增加这一过程则性能会降低,所以最好直接使用大写。

use master
go
-- 判断数据库是否已经存在,若存在不删除直接使用,反之新建
IF EXISTS(SELECT * FROM sysdatabases WHERE name='StuInfo')   PRINT 'StuInfo数据库已存在'
ELSE
BEGIN--创建数据库CREATE DATABASE StuInfoON(NAME=StuInfo,FILENAME='D:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\StuInfo.mdf',SIZE=3MB,MAXSIZE=UNLIMITED,FILEGROWTH=10%)LOG ON(NAME=StuInfo_log,FILENAME='D:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\StuInfo_log.ldf',SIZE=1MB,MAXSIZE=100MB,FILEGROWTH=10%)
END
GOUSE StuInfo
GO
-- 判断数据表是否已经存在,若存在删除后创建
IF OBJECT_ID(N'StuInfo..student',N'U') IS NOT NULLDROP TABLE studentCREATE TABLE student
(
[s_id][char](10)NOT NULL,
[sname][nvarchar](5)NULL,
[ssex][nvarchar](1)NULL,
[sbirthday][date]NULL,
[sdepartment][nvarchar](10)NULL,
[smajor][nvarchar](10)NULL,
[spoliticalStatus][nvarchar](4)NULL,
[phoneName][varchar](100)NULL,
[photo][varchar](max)NULL,
[smemo][nvarchar](max)NULL,
CONSTRAINT[PK_student]PRIMARY KEY CLUSTERED
([s_id] ASC
))on [PRIMARY]
GO-- 向数据库添加数据
USE StuInfo
INSERT INTO
student  ([s_id],[sname],[ssex],[sbirthday],[sdepartment],[smajor],[spoliticalStatus],[photo],[smemo])
VALUES
('20070101',N'张莉',N'女','1/30/1998',N'信息工程学院',N'计算机',N'党员',NULL,NULL)
,
('20070102',N'张建',N'男','1/30/1998',N'信息工程学院',N'计算机',N'党员',NULL,NULL)
GO

SQL -- 游标(详细)相关推荐

  1. sql游标 while_用SQL Server中的排名函数替换SQL While循环和游标,以提高查询性能

    sql游标 while SQL While loop and cursor are the most common approach to repeat a statement on conditio ...

  2. Library Cache优化与SQL游标

    点击查看全文 Dear 跟着小编一起读好书运动开始啦!咱们作为DBA不仅要外部打扮自己,更要从内部武装.近期,小编将分享冷菠老师的<Oracle高性能自动化运维>一部分精选章节分享给大家. ...

  3. 如何创建和使用 SQL 游标

    文章目录 一.游标 二.使用游标 2.1 创建游标 2.2 使用游标 2.3 关闭游标 三.小结 本文介绍什么是 SQL 游标,为什么使用游标,如何使用游标.你使用的 DBMS 可能会提供某种形式的游 ...

  4. SQL 游标使用示例

    SQL游标(cursor)详细说明及内部循环使用示例 定义 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取 ...

  5. PL/SQL 游标

    本随笔不是原创,只是学习笔记,用于加深记忆,原创地址PL/SQL --> 游标 一.游标的相关概念和特性 1.定义: 映射到结果集中的某一行的特定位置,类似与C语言中的指针.即通过游标方式定位到 ...

  6. SQL游标的使用与语法

    2019独角兽企业重金招聘Python工程师标准>>> 以[master].[dbo].[spt_values] 这个表为例子 === declare @name nvarchar( ...

  7. 查看你某条sql是哪个用户执行的_django_debug_toolbar:查看访问某个页面执行sql的详细...

    django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能,包括查看执行的sql语句,db查询次数,request,headers,调试概览等. 1.官方推荐 ...

  8. sql replace替换多个字符_牛客网数据库SQL实战详细剖析(4150)

    文章来源:大数据肌肉猿 作者:无精疯 这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程.具体题目可参考牛客网的SQL实战模块:https://www.nowcoder ...

  9. SQL游标原理和使用方法(转)

    SQL游标原理和使用方法 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记 ...

  10. [Oracle] SQL*Loader 详细使用教程(3)- 控制文件

    控制文件是SQL*Loader里最重要的文件,它是一个文本文件,用来定义数据文件的位置.数据的格式.以及配置数据加载过程的行为,在sqlldr中以control参数指定控制文件.   在控制文件里配置 ...

最新文章

  1. mysql insert 主键冲突_insert 时防止出现主键冲突错误的方法
  2. Python-学习-import语句导入模块
  3. java技术简介英文_Java技术常见的英文缩写
  4. 句向量的表示(上)—无监督
  5. 如何执行一段java代码_V8 之 如何执行一段 JavaSscript 代码
  6. 苹果企业账号炒作到多少钱_从炒作到行动:边缘计算的后续步骤
  7. html日期自动更新,原生javascript实现自动更新的时间日期_javascript技巧
  8. 2.1.PHP7.1 狐教程-【PHP基础】
  9. AssetBundle资源冗余检测
  10. Flash中的计时器
  11. 史上最通俗易懂的YOLOv2讲解
  12. 【MySQL】 锁机制:InnoDB引擎中锁分类以及表锁、行锁、页锁详解
  13. 小红书投放怎么变现?品牌做小红书的变现效果好吗
  14. 2018 11.2 PION模拟赛
  15. QQ看点模块思维导图
  16. 【类和对象】深入浅出类和对象
  17. 275、Java基础51 - 数字与字符串【格式化输出】 2019.11.21
  18. 外卖cps淘宝客如何实现用户与订单的绑定(附外卖cps带分销返利源码)
  19. Windows Phone开发基础(10)Visifire 使用详解之 AxisLabels
  20. github创建账号第一步始终出错

热门文章

  1. 初入社会要避免入的坑-租房篇
  2. 使用树莓派+arduino+采集卡+frp实现异地控制电视机顶盒
  3. linux dd nand,uboot 中 Nand flash 常用操作命令解释
  4. Google Chrome浏览器JS调试工具
  5. 51单片机c语言编程100,51单片机C语言编程100例.doc
  6. C语言中,声明和定义的区别
  7. 谈谈对Spring IOC(控制反转)的理解--转
  8. 微信小程序使用echarts绘画动态图表
  9. oracle orion测试工具的使用
  10. Xz1android9打电话延迟,索尼Xperia XZ与XZ1系列正式获得Android 9升级;但这新