什么是游标

结果集,结果集就是select查询之后返回的所有行数据的集合。

游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。

一般复杂的存储过程,都会有游标的出现,他的用处主要有:

定位到结果集中的某一行。

对当前位置的数据进行读写。

可以对结果集中的数据单独操作,而不是整行执行相同的操作。

是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。

游标使用三步曲:第一步创建游标,第二步打开游标,第三步使用游标。

游标使用

第一步创建游标

语法

--声明数据库引用

use 数据库名;

go

--创建游标

declare cursor_name [insensitive] [scroll] cursor

for select_statement

[for { read only | update [of column_name [,......n] ] } ];

语法注释

--cursor_name

--Transact-SQL服务器游标定义的名称。cursor_name必须符合有关标识符的规则。

--insensitive

--定义一个游标,以创建将由该游标使用的数据的临时副本。对游标的所有请求都从tempdb中的这一临时表中得到应答;

--因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。

--使用ISO语法时,如果省略insensitive,则已提交的(任何用户)对基础表的删除和更新则会反映在后面的提取操作中。

--scroll

--指定所有的提取选项(first、last、prior、next、relative和absolute)均可用。 如果未在iso declare cursor中指定scroll,则next是唯一支持的提取选项。

--如果还指定了fast_forward,则无法指定scroll。

--select_statement

--是定义游标结果集的标准select语句。在游标声明的select_statement中不允许使用关键字for browse和into。

--如果select_statement中的子句与所请求的游标类型的功能有冲突,则SQLServer会将游标隐式转换为其他类型。

--read only

--禁止通过该游标进行更新。无法在update或delete语句的where current of子句中引用游标。该选项优先于要更新的游标的默认功能。

--update [of column_name [,...n]]

--定义游标中可更新的列。如果指定了of <column_name> [, <... n>],则只允许修改所列出的列。 如果指定了update,但未指定列的列表,则可以更新所有列。

示例

--声明数据库引用

use testss;

go

--第一种ISO语法

--游标使用三步曲

--第一步声明游标

declare synae_cursor_name insensitive scroll cursor

for select id,name from test1

for read only;

示例结果

第二步打开游标

语法

open { { [ global ] cursor_name } | cursor_variable_name }

语法解析

--global

--指定cursor_name是指全局游标。

--cursor_name

--已声明的游标的名称。当同时存在以cursor_name作为名称的全局游标和局部游标时,如果指定global,则cursor_name是指全局游标;否则,cursor_name是指局部游标。

--cursor_variable_name

--游标变量的名称,该变量引用一个游标。

示例

open global synae_cursor_name;

示例结果

第三步使用游标

语法

fetch [ [ next | prior | first | last | absolute { n | @nvar } | relative { n | @nvar } ] from ] { { [ global ] cursor_name } | @cursor_variable_name } [ into @variable_name [ ,...n ] ]

语法注释

--next

--紧跟当前行返回结果行,并且当前行递增为返回行。如果fetch next为对游标的第一次提取操作,则返回结果集中的第一行。next为默认的游标提取选项。

--prior

--返回紧邻当前行前面的结果行,并且当前行递减为返回行。如果fetch prior为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。

--first

--返回游标中的第一行并将其作为当前行。

--last

--返回游标中的最后一行并将其作为当前行。

--absolute { n| @nvar}

--如果 n 或 @nvar 为正,则返回从游标起始处开始向后的第 n 行,并将返回行变成新的当前行。

--如果 n 或 @nvar 为负,则返回从游标末尾处开始向前的第 n 行,并将返回行变成新的当前行。

--如果 n 或 @nvar 为 0,则不返回行。 n 必须是整数常量,并且 @nvar 必须是 smallint、tinyint 或 int。

--relative { n| @nvar}

--如果 n 或 @nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。

--如果 n 或 @nvar 为负,则返回从当前行开始向前的第 n 行,并将返回行变成新的当前行。

--如果 n 或 @nvar 为 0,则返回当前行。 在对游标进行第一次提取时,

--如果在将 n 或 @nvar 设置为负数或 0 的情况下指定fetch relative,则不返回行。 n 必须是整数常量,并且 @nvar 必须是 smallint、tinyint 或 int。

--global

--指定 cursor_name 是指全局游标。

--cursor_name

--要从中进行提取的开放游标的名称。 当同时存在以 cursor_name 作为名称的全局游标和局部游标时,

--如果指定global,则 cursor_name 指全局游标,如果未指定 global,则指局部游标。

--@cursor_variable_name

--游标变量名,引用要从中进行提取操作的打开的游标。

--into @variable_name[ ,...n]

--允许将提取操作的列数据放到局部变量中。 列表中的各个变量从左到右与游标结果集中的相应列相关联。

--各变量的数据类型必须与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换。 变量的数目必须与游标选择列表中的列数一致。

示例

declare @id nvarchar(50),@name nvarchar(50);

fetch last from synae_cursor_name into @id,@name;

select @id,@name;

示例结果

游标使用扩展

查看游标

语法

exec sp_cursor_list [ @cursor_return = ] cursor_variable_name output, [ @cursor_scope = ] cursor_scope [;]

语法解析

--[@cursor_return=] cursor_variable_name 输出

--已声明的游标变量的名称。 cursor_variable_name是光标,无默认值。 游标是可滚动、 动态、 只读游标。

--[ @cursor_scope=] cursor_scope

--指定要报告的游标级别。 cursor_scope是int,无默认值,并且可以是下列值之一。

--@cursor_scope=1(local)(报告所有本地游标)

--@cursor_scope=2(global)(报告所有全局游标)

--@cursor_scope=3(global和local)(报告本地游标和全局游标)

示例

declare @result cursor

exec sp_cursor_list @cursor_return=@result output,@cursor_scope=2;

fetch next from @result;

示例结果

关闭游标

语法

close { { [ global ] cursor_name } | cursor_variable_name }

语法解析

--global

--指定cursor_name是指全局游标。

--cursor_name

--打开的游标的名称。 当同时存在以cursor_name作为名称的全局游标和局部游标时,如果指定global,则cursor_name 是指全局游标;否则,cursor_name 是指局部游标。

--cursor_variable_name

--与打开的游标关联的游标变量的名称。

示例

close global synae_cursor_name;

示例结果

删除游标

语法

deallocate { { [ global ] cursor_name } | @cursor_variable_name }

语法解析

--cursor_name

--已声明游标的名称。 当同时存在以 cursor_name 作为名称的全局游标和局部游标时,如果指定 GLOBAL,则 cursor_name 指全局游标,如果未指定 GLOBAL,则指局部游标。

--@cursor_variable_name

--cursor 变量的名称。 @cursor_variable_name必须为cursor类型。

示例

deallocate global synae_cursor_name;

示例结果

SQLServer之ISO游标使用相关推荐

  1. SqlServer系列笔记——游标

    游标的概念 游标是一种数据访问机制,是一个在给定结果集中以行为单位访问和操纵数据的数据库对象 游标的好处:可以逐行的处理数据允许定位于结果集中的特定的行从当前结果集中获取一行 能对结果集的当前行进行修 ...

  2. 微软SQL Server数据库的两种请求游标

    游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字.用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理. 关系数据库中的操 ...

  3. 怎样查出SQLServer的性能瓶颈

    --王成辉翻译整理,转贴请注明出自微软BI开拓者[url]www.windbi.com[/url] --原帖地址 如果你曾经做了很长时间的DBA,那么你会了解到SQLServe的性能调优不是一个精密的 ...

  4. 做好DBA,做好SQLServer性能优化

    怎样查出SQLServer的性能瓶颈 --王成辉翻译整理,转贴请注明出自微软BI开拓者[url]www.windbi.com[/url] --原帖地址 如果你曾经做了很长时间的DBA,那么你会了解到S ...

  5. sqlserver 触发器实例代码

    何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Insert , Update , D ...

  6. MySql 自定义函数,存储过程,游标的使用

    首先整理一下mysql内置的一些函数 MySQL内置函数 一.字符函数 (1)CONCAT()//字符连接 (2)CONCAT_WS()//使用指定的分隔符进行字符连接 (3)FORMAT()//数字 ...

  7. ADO.NET 2.0中的SqlCommand.ExecutePageReader

    http://blog.joycode.com/liuhuimiao/ 在.NET 2.0 PDC或Beta1中,可以看到SqlCommand对象新增了个ExecutePageReader方法,该方法 ...

  8. mysql数据库使用

    C#操作Mysql数据库的存储过程,网址 DATEDIFF() 函数返回两个日期之间的天数. 语法 DATEDIFF(date1,date2) date1 和 date2 参数是合法的日期或日期/时间 ...

  9. Android切近实战(八)

    天冷了,老夫要把伙食搞上去,这不最近在软件园二楼吃,伙食15块,杠杠的. 美包包,不说了,进入正题.今天老夫要讲的是读取联系人,其实我做这个的初衷是想做一个短信拦截,电话拦截的功能. 我们先看一下界面 ...

最新文章

  1. 用计算机演银河系,天文学家利用计算机模拟类银河星系
  2. c# BackgroundWorker组件介绍(属性、方法、事件)
  3. 为什么Android教程中的大多数字段(类成员)都以`m`开头?
  4. java代码审查规范
  5. binary hacks读数笔记(共享库)
  6. Python基础03 序列
  7. mysql 终端 远程访问,通过终端连接到远程mysql
  8. mongodb$pull数组更新操作符
  9. 2022春季“金三银四”跳槽必备:软件测试面试题(附带答案)
  10. Python:字符串、列表、元组、字典之间的相互转换
  11. 参数检验和非参数检验
  12. ffmpeg sdk 的一些资料博客地址
  13. 利用WireShark下载视频网站的流媒体视频
  14. Android游戏开发教程汇总
  15. java 数组的class_Java Class isArray()方法
  16. 嫂嫂学计算机,开心一刻,,老妈催婚, 含泪让男闺蜜冒充, 进门后嫂子愣住了…
  17. ExecutorService 详解 -- 执行器服务(线程池)
  18. 计算机连不了无线网络,如何解决电脑连接不上家里路由器的无线网
  19. Oracle SQL:update更新语句总结
  20. 【can总线】stm32的can控制器

热门文章

  1. 19.Remove Nth Node From End of List
  2. hadoop程序MapReduce之SingletonTableJoin
  3. 15-11-23:system指令
  4. VirtualBox上Ubuntu 共享文件夹
  5. 操作SQLite数据库
  6. DotNet关键知识点——WCF篇(六)
  7. Category Archives: Linux
  8. C#的6种常用集合类大比拼【月儿原创】
  9. asp.net利用RAR实现文件压缩解压缩【月儿原创】
  10. 设计模式之适配器模式(Adapter)摘录