SQLServer之ISO游标使用
什么是游标
结果集,结果集就是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游标使用的更多相关文章
- SqlServer和MySQL游标学习
一 sqlserver游标使用 /*** 游标的使用 讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱. 使用游标的顺序: 声名游标.打开游标.读取数据.关闭游标.删除游标. 1.3.1 ...
- sqlserver存取过程游标
ALTER proc [dbo].[common_proc_temp2] as begin declare @id varchar(50); declare @cbcontractid varchar ...
- sqlserver存取过程-游标
ALTER proc [dbo].[common_proc_temp2] as begin declare @id varchar(50); declare @cbcontractid varcha ...
- SqlServer基础:游标
记录下今天用到的游标: DECLARE @TempID INTDECLARE @Number INTSET @Number=1DECLARE myCursor CURSOR FOR SELEC ...
- sqlserver 表循环-游标、表变量、临时表
SQL Server遍历表的几种方法 阅读目录 使用游标 使用表变量 使用临时表 在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易 ...
- sqlserver 存储过程返回游标的处理
创建表: create table tb1( id int , name ) ) ------------------------------------------------- 创建返回游标的存储 ...
- SqlServer高级特性--游标
游标 用途:在数据很多的时候,如果在java代码中进行循环之后再进行更新数据,会造成频繁的连接数据库,耗费性能,所以就可以使用到游标 作用:查询出来的集合直接在SQL中进行遍历在进行更新 DECLAR ...
- SqlServer数据库之游标
游标的简单实现,直接上SQL语句 --循环对每一个代理统计业绩 DECLARE cursor_name CURSOR FOR --定义游标 需要进行游标的数据表 SELECT * FROM #Agen ...
- 【SQLSERVER】动态游标的实现
方法1: CREATE TABLE #tabTmp(id int) INSERT #tabTmp EXECUTE('SELECT id FROM '+@Table ...
随机推荐
- android 自定义权限管理
在Android6.0后有些权限就需要进行询问,虽然可以将targetSdkVersion设置成小于等于23,但是这样可能有些东西无法使用,所以要进行权限的管理. 实现逻辑:打开页面就询问权限,如果没 ...
- 【学习笔记】【Design idea】二、产品内测、公测、候选版本的概念及版本代码的书写
一.前言 参考:百度百科 https://baike.baidu.com/item/beta/640969?fr=aladdin 广义上对测试有着三个传统的称呼:Alpha(α).Beta(β)和Ga ...
- 将Python 程序打包成 .exe格式入门
PyInstaller PyInstaller 是一个十分有用的第三方库,可以用来打包 python 应用程序,打包完的程序就可以在没有安装 Python 解释器的机器上运行了. 它能够在 Windo ...
- 基于vue-cli构建vue-router的入门级demo
前言 本案列仅针对刚刚入门vue学习的伙伴,博主也是刚刚在学基于vue-cli搭建脚手架项目,对于前端大牛,可以移步. 快速搭建vue-cli环境 如何搭建基于vue-cli项目,这里不再叙述,如果不 ...
- 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二九║ Nuxt实战:异步实现数据双端渲染
回顾 哈喽大家好!又是元气满满的周~~~二哈哈,不知道大家中秋节过的如何,马上又是国庆节了,博主我将通过三天的时间,给大家把项目二的数据添上(这里强调下,填充数据不是最重要的,最重要的是要配合着让大家 ...
- 一次生产 CPU 100% 排查优化实践
前言 到了年底果然都不太平,最近又收到了运维报警:表示有些服务器负载非常高,让我们定位问题. 还真是想什么来什么,前些天还故意把某些服务器的负载提高(没错,老板让我写个 BUG!),不过还好是不同的环 ...
- 批量执行工具PSSH详解
批量执行工具PSSH详解 pssh是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,使用必须在各个服务器上配置好密钥认证访问. 安装pssh包 yum 安 ...
- 《前端之路》之 初识 JavaScript
01 初识 JavaScript 作为在码农圈混迹了 四五年的老码畜来说,学习一门新的语言,就仿佛是老司机开新车一样 轻车熟路. 为什么会这么快呢? 因为各种套路啊- 任何一种计算机语言的最开始都是和 ...
- 『集群』006 Slithice 后期改进 和 Slithice可能存在的BUG
Slithice 后期改进 和 Slithice可能存在的BUG Slithice 可能存在的 BUG: >Slithice 暂时 没有 对 循环调度 进行控制:不正确的 配置 可能导致 调度死 ...
- 移动APP及游戏推广,有预算为什么还起不了量
本文转自公众号:caoz的梦呓,作者是互联网行业内资深人士,这里分享一篇他本人写的经验干货,希望能给大家带来点帮助. 在广告分析师群,起量是他们讨论最多的话题之一. 我们刚做游戏出海业务的时候,第一款 ...