SqlServer游标的创建与使用(下)

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: SqlServer游标的创建与使用(下)

2、打开游标对象

打开游标使用Open语句用于打开Transaction-SQL服务器游标,执行Open语句的过程中就是按照Select语句进行填充数据,打开游标以后游标位置在第一行。

打开游标

全局游标:Open Global MyCursor 局部游标: Open MyCursor

游标对象创建之后,必须打开之后才能进行使用,使用关键字open。

--打开游标
open MyCursor;

3、读取游标数据

在打开游标以后,使用Fetch语句从Transaction-SQL服务器游标中检索特定的一行。使用Fetch操作,可以使游标移动到下一个记录,并将游标返回的每个列得数据分别赋值给声明的本地变量。

Fetch [Next | Prior | First | Last | Absolute n | Relative n ] From MyCursor

Into @GoodsID,@GoodsName

其中:Next表示返回结果集中当前行的下一行记录,如果第一次读取则返回第一行。默认的读取选项为Next

Prior表示返回结果集中当前行的前一行记录,如果第一次读取则没有行返回,并且把游标置于第一行之前。

First表示返回结果集中的第一行,并且将其作为当前行。

Last表示返回结果集中的最后一行,并且将其作为当前行。

Absolute n 如果n为正数,则返回从游标头开始的第n行,并且返回行变成新的当前行。如果n为负,则返回从游标末尾开始的第n行,并且返回行为新的当前行,如果n为0,则返回当前行。

Relative n 如果n为正数,则返回从当前行开始的第n行,如果n为负,则返回从当前行之前的第n行,如果为0,则返回当前行。

--读取游标数据
--声明两个变量接收从游标中取出的值
declare @Name varchar(50),@ClassName varchar(50);    
    --移动游标取值
    fetch next from MyCursor into @Name,@ClassName;
    print(@Name);
    print(@ClassName);

4、关闭游标

游标使用完毕之后需要关闭,以及资源的释放,关键字close,deallocate。

--关闭游标
CLOSE MyCursor

5、释放游标

游标使用完毕之后需要关闭,以及资源的释放,关键字close,deallocate。

--释放游标
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参数。

 


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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
SQL
sql server 游标的使用
sql server 游标的使用
66 0
|
存储 SQL 程序员
【Sql Server】 使用游标循环记录更新字段值
使用游标循环记录更新字段值
373 0
【Sql Server】 使用游标循环记录更新字段值
SQLSERVER 游标的使用
sql server 的游标使用
6282 0
|
SQL 数据库 Go
SQL Server里面如何检查没有释放的游标
原文:SQL Server里面如何检查没有释放的游标     一直以来对SQL SERVER的游标都不怎么感冒,也很少使用SQL Server里面的游标,前几天有一位网友问如何检查数据库里面没有释放的游标,觉得有点意思,就测试验证了一下,顺便整理于此。
833 0
|
SQL 存储 数据库
SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database)
原文:SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:运用游...
1377 0