SQL SERVER中的游标
游标的概念
游标是一种能从包含多个元组的集合中每次读取一个元组的机制。游标总是和一段SELECT语句关联,SELECT语句查询出的结果集就作为集合,游标能每次从该集合中读取出一个元组进行不同操作。
游标的作用
- 将游标定位在结果集特定元组。
- 将游标指定结果集中的元组数据读出。
- 利用循环读取结果集中的多个元组数据。
- 对游标指定结果集的元组进行数据修改。
- 为其它用户设置结果集数据的更新限制。
- 提供脚本、存储过程和触发器中访问结果集中数据的TSQL语句。
SQL SERVER游标类型支持TSQL游标、API游标和客户游标。
游标的管理
声明游标
DECLARE cursor_name CURSOR [INSENSITIVE] [SCROLL] CURSORFOR <SELECT语句>
[FOR READ ONLY|UPDATE[OF <列名>[,...n]]]
- INSENSITIVE:定义游标所选出的结果集存放在一个临时表,对该游标的读取操作都有该临时表来应答。游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该关键字,对基本表的更新、删除都会反应到游标中。
- SCROLL:指定游标使用的读取选项,默认值为NEXT,如果不使用该关键字,那么读取游标只能进行NEXT操作,如果使用该关键字,那么游标向任何方向,或者任何位置移动,进行NEXT、LAST、FIRST、PRIOR、RELATIVE n、ABSULUTE n操作。
- FOR READ ONLY:表示定义游标为只读游标,不允许使用UPDATE、DELETE语句更新游标内的数据。
- UPDATE[OF <类名>[,...n]]:指定游标内可以更新的列,如果有指定要更新的列,则表明所有列都允许更新。
打开游标
游标在声明以后需要打开后,才能使用。
OPEN [LOCAL|GLOBAL] cursor_name;
LOCAL|GLOBAL:指定游标为局部或全局游标。
读取游标
FETCH [NEXT|PRIOR|FIRST|LAST|ABSLUTE n|@nvar]|RELATIVE n|@nvar]
FROM [GLOBAL]cursor_name
INTO[@nvar1,...n]
名称 | 含义 |
---|---|
FIRST | 读取游标中第一行数据 |
LAST | 读取游标最后一行数据 |
NEXT | 读取游标当前行下一行数据 |
PRIOR | 读取游标当前行上一行数据 |
RELATIVE n | 读取游标当前行之前或之后第n行数据(n为正则向前,反之则向后) |
ABSULUTE n | 读取游标第n行数据(n为负从最后一行开始,反之则从第一行开始) |
关闭游标
在处理完结果集中数据之后,必须关闭游标来释放结果集
CLOSE [GLOBAL] cursor_name
释放游标
游标使用不再需要之后,需要释放游标,以获取与游标有关的一切资源。
DEALLOCATE [GLOBAL] cursor_name
游标系统变量与函数
游标系统变量与函数返回有关游标的信息。
- @@CURSOR_NUM
返回最后打开的游标中满足条件的元组数。
- @@FETCH_STATUS
返回上次执行FETCH命令的状态。
返回值 | 说明 |
---|---|
0 | FETCH语句成功 |
-1 | FETCH语句失败或此元组不在结果集中 |
-2 | 被读取的元组不存在 |
- CURSOR_STATUS('GLOBAL|LOCAL','cursor_name')
返回值 | 意义 |
---|---|
1 | 结果集至少一行 |
0 | 结果集为空 |
-1 | 游标被关闭 |
-2 | 游标不可用 |
-3 | 指定游标不存在 |
用于确定是否返回游标和结果集。
利用游标修改和删除表数据
可以通过游标来UPDATE修改或删除DELETE表中的当前数据行。
--修改数据
UPDATE table_nameSET column_name=value|expressionWHERE CURRENT OF cursor_name
--删除数据
DELETE FROM table_nameWHERE CURRENT OF cursor_name
举例
有一张学生信息表S表。
1. 声明一个标准的游标,并使用它
USE SCHOOL;
GO
DECLARE normal_cursor CURSOR --声明游标FOR SELECT TOP 10 SNAME FROM S;
OPEN normal_cursor;--打开游标
DECLARE @var_name VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH NEXT FROM normal_cursor INTO @var_name;--通过FETCH操作抓取数据存储到变量中
PRINT @var_name --打印FETCH得到的元组
GO
CLOSE normal_cursor;
2.试使用该游标读取结果集最后一行的元组。
OPEN normal_cursor;--打开游标
DECLARE @var_name VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH LAST FROM normal_cursor INTO @var_name;--通过FETCH操作抓取数据存储到变量中
PRINT @var_name --打印FETCH得到的元组
GO
CLOSE normal_cursor;
出现ERROR,因为在DECLARE CUROSR时,我们没有声明SCROLL关键字,则默认值为NEXT,那么在对该游标进行FETCH操作时,只能进行NEXT操作。
DECLARE scroll_cursor1 SCROLL CURSOR --声明游标FOR SELECT TOP 10 SNAME FROM S;
OPEN scroll_cursor1;--打开游标
DECLARE @var_name1 VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH LAST FROM scroll_cursor1 INTO @var_name1;--通过FETCH操作抓取数据存储到变量中
PRINT @var_name1 --打印FETCH得到的元组
GO
CLOSE scroll_cursor1;
成功读取到结果集最后一行元组,声明SCROLL关键字以后,FETCH还可以进行NEXT、LAST、FIRST、RELATIVE等操作。
OPEN scroll_cursor1;--打开游标
DECLARE @var_name1 VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH LAST FROM scroll_cursor1 INTO @var_name1;--通过FETCH操作抓取数据存储到变量中
SELECT @var_name1 AS '最后一行数据'--打印FETCH得到的元组
SELECT @@CURSOR_ROWS AS '当前游标元组数',@@FETCH_STATUS AS '上次FETCH操作状态',CURSOR_STATUS('GLOBAL','scroll_cursor1') AS '游标状态'
GO
CLOSE scroll_cursor1;
下面利用WHILE循环打印出游标中的结果集。
OPEN scroll_cursor1;--打开游标
DECLARE @var_name1 VARCHAR(10);--声明变量,以便后续存储FETCH操作得到元组
FETCH NEXT FROM scroll_cursor1 INTO @var_name1;--通过FETCH操作抓取数据存储到变量中
WHILE(@@FETCH_STATUS=0)--判断是否读取到最后一行BEGINPRINT @var_name1;FETCH NEXT FROM scroll_cursor1 INTO @var_name1;--将下一行新值覆盖变量原来的值END
GO
CLOSE scroll_cursor1;
写此篇博客意为记录分享学习技术上所学内容,作者能力有限,如有不足之处还请斧正。
SQL SERVER中的游标相关推荐
- Sql Server 中利用游标对table 的数据进行分组统计式输出…
Sql Server 中利用游标对table 的数据进行分组统计式输出- Table Name: Tb_Color Create table Tb_Color(id int identity(1,1) ...
- SQL Server中自定义函数和游标应用的经典案例
2019独角兽企业重金招聘Python工程师标准>>> SQL Server中自定义函数和游标应用的经典案例 转载于:https://my.oschina.net/zhddzr/bl ...
- sql游标 while_用SQL Server中的排名函数替换SQL While循环和游标,以提高查询性能
sql游标 while SQL While loop and cursor are the most common approach to repeat a statement on conditio ...
- 游标sql server_了解游标并将其替换为SQL Server中的JOIN
游标sql server Relational database management systems including SQL Server are very good at processing ...
- 十步优化SQL Server中的数据访问
故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...
- 【转】在SQL Server中通过SQL语句实现分页查询
在SQL Server中通过SQL语句实现分页查询 2008年01月06日 星期日 12:28 建立表: CREATE TABLE [TestTable] ( [ID] [int] IDENTITY ...
- 在SQL Server中分页结果的最佳方法是什么
如果您还希望获得结果总数(在进行分页之前),那么在SQL Server 2000.2005.2008.2012中对结果进行分页的最佳方法是(性能明智的)? #1楼 最终, Microsoft SQL ...
- SQL Server中的锁类型及用法(转载)
一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 ...
- SQL Server中的几个方法和Transact SQL 常用语句以及函数[个人推荐]
--数据操作 SELECT --从数据库表中检索数据行和列 INSERT --向数据库表添加新数据行 DELETE --从数据库表中删除数据行 UPDATE --更新数据库表中的数据 -- ...
最新文章
- R语言笔记-sample()函数
- python中的参数值无法传递_python中关于函数参数值传递的问题
- ZOJ 1970 All in All
- springboot配置跨mapper.xml的全局变量
- argparse模块---解析命令行参数
- 2017.10.13 硬币游戏 思考记录
- verilog学习记(快速入门)
- SQL优化的思路及基本原则(mysql)
- 三次握手四次挥手必掌握,看了绝对不吃亏!
- UPCA条形码生成器
- iOS 第三方库、插件、知名博客总结
- 狼图腾--满族为什么能以少统多
- CM311-1a_YST代工_安卓9_S905L3A_没无线版Emotn UI桌面线刷固件包
- IBM JDK官方下载地址
- matlab-微分方程求解方法汇总
- Mac下cmake使用
- win 7使用mimikatz实现MS14-068漏洞
- 使用Scrapy爬取掘金热门文章的分析和实现
- 使用Post不传Body,出现socket hang up报错
- ISO26262标准概览