什么是游标

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

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

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

  • 定位到结果集中的某一行。
  • 对当前位置的数据进行读写。
  • 可以对结果集中的数据单独操作,而不是整行执行相同的操作。
  • 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。

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

游标的使用范围是当前会话。

游标使用

第一步创建游标

语法

--声明数据库引用
use testss;
go

--第二种Transact-SQL扩展语法
--Transact-SQL Extended Syntax
declare cursor_name cursor [ local | global ]
[ forward_only | scroll ]
[ static | keyset | dynamic | fast_forward ]
[ read_only | scroll_locks | optimistic ]
[ type_warning ]
for select_statement
[ for update [ of column_name [ ,...n ] ] ]
[;]

语法注释

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

--local
--指定该游标的范围对在其中创建它的批处理、存储过程或触发器是局部的。
--该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程output参数中,该游标可由局部游标变量引用。
--output参数用于将局部游标传递回调用批处理、存储过程或触发器,它们可在存储过程终止后给游标变量分配参数使其引用游标。
--除非output参数将游标传递回来,否则游标将在批处理、存储过程或触发器终止时隐式释放。如果output参数将游标传递回来,则游标在最后引用它的变量释放或离开作用域时释放。

--global
--指定该游标范围对连接是全局的。在由此连接执行的任何存储过程或批处理中,都可以引用该游标名称。
--该游标仅在断开连接时隐式释放。
--备注
--如果global和local参数都未指定,则默认值由“默认为本地游标”数据库选项的设置控制。

--forward_only
--指定游标只能从第一行滚动到最后一行。fetch next是唯一支持的提取选项。
--如果指定了forward_only而没有指定static、keyset和dynamic关键字,则游标作为dynamic游标进行操作。
--如果未指定forward_only和scroll,则默认为forward_only,
--除非指定了关键字static、keyset或dynamic。static、keyset和dynamic游标默认为scroll。
--与odbc和ado等数据库API不同,static、keyset和dynamic Transact-SQL游标支持forward_only。

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

--static
--定义一个游标,以创建将由该游标使用的数据的临时副本。对游标的所有请求都从tempdb中的这一临时表中得到应答;
--因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。

--keyset
--指定当游标打开时,游标中行的成员身份和顺序已经固定。对行进行唯一标识的键集内置在tempdb内一个称为keyset的表中。
--备注
--如果查询引用了至少一个无唯一索引的表,则键集游标将转换为静态游标。
--对基表中的非键值所做的更改(由游标所有者更改或由其他用户提交)可以在用户滚动游标时看到。
--其他用户执行的插入是不可见的(不能通过Transact-SQL服务器游标执行插入)。如果删除某一行,则在尝试提取该行时返回的@@fetch_status为-2。
--从游标外部更新键值类似于删除旧行后再插入新行。具有新值的行不可见,且尝试提取具有旧值的行时返回的@@fetch_status为 -2。
--如果通过指定where current of子句来通过游标执行更新,则新值可见。

--dynamic
--定义一个游标,以反映在滚动游标时对结果集内的各行所做的所有数据更改。
--行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持absolute提取选项。

--fast_forward
--指定已启用了性能优化的fast_forward和read_only游标。如果还指定了scroll或for_update,则无法指定fast_forward。
--备注
--可以在相同的declare cursor语句中使用fast_forward和forward_only。

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

--scroll_locks
--指定通过游标进行的定位更新或删除一定会成功。将行读入游标时SQLServer将锁定这些行,以确保随后可对它们进行修改。
--如果还指定了fast_forward或static,则无法指定scroll_locks。

--optimistic
--指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。
--当将行读入游标时,SQLServer不锁定行。
--相反,它使用timestamp列值的比较,或者如果表没有timestamp列则使用校验和值,以确定将行读入游标后是否已修改该行。
--如果已修改该行,尝试进行的定位更新或定位删除将失败。如果还指定了fast_forward,则无法指定optimistic。

--type_warning
--指定如果游标从所请求的类型隐式转换为另一种类型,则向客户端发送警告消息。

--select_statement
--定义游标结果集的标准select语句。在游标声明的select_statement中不允许使用关键字compute、compute by、for browse和into。
--备注
--可以在游标声明中使用查询提示;但如果还使用for update of子句,请在for update of之后指定option(<query_hint>)。
--如果select_statement中的子句与所请求的游标类型的功能有冲突,则SQLServer会将游标隐式转换为其他类型。有关详细信息,请参阅“隐式游标转换”。

--for update [of column_name [,...n]]
--定义游标中可更新的列。 如果提供了of <column_name> [, <... n>],则只允许修改所列出的列。 如果指定了update,但未指定列的列表,则除非指定了read_only并发选项,否则可以更新所有的列。

示例

declare firstcursor cursor
scroll
static
read_only
type_warning
for
select id,name from test1
--for update;

示例结果

第二步打开游标

语法

open { { [ global  ] cursor_name } | cursor_variable_name }

语法解析

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

示例

open firstcursor;

示例结果

第三步使用游标

语法

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 first from firstcursor into @id,@name;
select @id,@name;

示例结果

SQLServer之创建Transact-SQL游标的更多相关文章

  1. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  2. SqlServer中创建Oracle连接服务器

    转自太祖元年的:http://www.cnblogs.com/jirglt/archive/2012/06/10/2544025.html参考:http://down.51cto.com/data/9 ...

  3. 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》

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

  4. SqlServer中创建Oracle链接服务器

    SqlServer中创建Oracle链接服务器 第一种:界面操作 (1)展开服务器对象-->链接服务器-->右击“新建链接服务器” (2)输入链接服务器的IP (3)链接成功后 第二种:语 ...

  5. 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

    数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...

  6. sqlserver命令创建数据库和表 demo

    由于sqlserver用起来很不爽 可以尝试用vscode+sqlserver插件玩玩 友情提示 在vscode中新建一个.sql 并配置好与sqlserver的连接 利用sql会有提示创建表 数据库 ...

  7. SQL Azure (16) 创建PaaS SQL Azure V12数据库

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China 最新的Azure PaaS SQL Database(SQL Azu ...

  8. --自动创建备份SQL

    --自动创建备份SQL DECLARE @dbname VARCHAR(50) ,--要备份的数据库名称 @bakname VARCHAR(50) ,--备份后的bat名称 @sql VARCHAR( ...

  9. 使用sql语句创建修改SQL Server标识列(即自动增长列)

    一.标识列的定义以及特点SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点:1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统 ...

  10. navicat 连接sqlserver提示要安装 sql server native client

    navicat 连接sqlserver提示要安装 sql server native client 解决方法:其实navicat自带sqlncli_x64.msi,就在安装目录下,安装后问题解决!

随机推荐

  1. c/c++ 动态库与静态库的制作和使用

    静态库的用法 静态库的文件名 libxxx.a -->对应windows的.lib文件 做静态库的命令: ar rcs libxxx.a file1.o file2.o file.o 使用静态库 ...

  2. git 版本库基础知识学习

    什么是版本库?什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可 ...

  3. 排错-升级Exchange 2013 CU22后程序名称显示异常

    近期在按需更新Exchange 2013 CU22补丁以便解决Microsoft Exchange Server ADV190007 Guidance for "PrivExchange&q ...

  4. Java提取URL某个参数的值

    Java提取Url中某个参数的值. public static String getParam(String url, String name) { String params = url.subst ...

  5. 使用正则替换script及其内容

    因做微信公众号文章保存,发现他的js大多数也用不着,所以就想着用正则替换掉源代码中的js片段 正则代码: <script(?:[^<]++|<(?!/script>))*+&l ...

  6. 在 ASP.NET Core 中集成 Skywalking APM

    前言 大家好,今天给大家介绍一下如何在 ASP.NET Core 项目中集成 Skywalking,Skywalking 是 Apache 基金会下面的一个开源 APM 项目,有些同学可能会 APM ...

  7. 一句话HTML编辑器

    一句话HTML编辑器 data:text/html,<body oninput="i.srcdoc=h.value"><style>#i{width:70% ...

  8. Asp.net Core的Swagger接口根据模块、版本分组

    近期一直在学习Asp.net Core,微软的文档太难看,都是英文翻译过来的,很不友好,感谢这个博客,从壹开始前后端分离[ .NET Core2.0 +Vue2.0 ],让我入门了,刚学到这个Swag ...

  9. 从壹开始前后端分离[.netCore 不定期 ] 36 ║解决JWT自定义中间件授权过期问题

    缘起 哈喽,老张的不定期更新的日常又开始了,在咱们的前后端分离的.net core 框架中,虽然已经实现了权限验证<框架之五 || Swagger的使用 3.3 JWT权限验证[修改]>, ...

  10. 使用Maven的assembly插件实现自定义打包

    一.背景 最近我们项目越来越多了,然后我就在想如何才能把基础服务的打包方式统一起来,并且可以实现按照我们的要求来生成,通过研究,我们通过使用maven的assembly插件完美的实现了该需求,爽爆了有 ...