首页 > 编程知识 正文

sql server是干嘛的,sql中游标的作用

时间:2023-05-04 20:41:50 阅读:120671 作者:2062

创建和使用SqlServer游标概述游标1是什么?游标概念2、游标配置3、游标分类API服务器游标transaction -如何使用SQL游标客户端游标游标1、游标2声明、游标2 有关读取光标数据4、关闭光标5、释放光标6、更改光标数据7和删除光标数据的完整实例使用光标的建议

前言

了解了SqlServer的视图、存储过程和触发器的创建和使用,现在让我们来看看游标是什么、它是如何使用的以及它在什么时候使用的。

光标1是什么? 游标概念游标是处理数据的一种方法,游标可以在结果集中一次前进或后退一行或多行,以便查看或处理结果集中的数据

允许逐行访问SQL Server返回的结果集。 使用“光标”(cursor )的一个主要原因是将集合操作转化为单个记录处理方法。

以SQL语言从数据库检索数据时,结果位于内存区域,通常是包含多条记录的集合。

游标机制允许用户在SQL server中逐行访问这些记录,并按自己的意愿查看和处理它们。

光标可以是一个指针,用于指定结果中的任意位置,并允许用户处理指定位置的数据。

2、构成光标的光标有光标结果集和光标位置两部分。

游标结果集:由定义游标的SELECT语句返回的行的集合。 游标位置指向此结果集的行的当前指针。

3、光标的分类光标有API服务器光标、Transaction-SQL光标和API客户端光标三种。

前两个游标也称为服务器游标,因为它们在服务器上运行。

API服务器游标API服务器游标主要应用于服务,当客户端的APP应用程序调用API游标函数时,服务器处理API函数。 可以使用API函数和方法实现以下功能:

(1)打开连接。

)2)设置定义光标特性的特性或属性,API自动将光标映射到每个结果集。

)3)执行一个或多个Transaction-SQL语句。

)4)使用API函数或方法提取结果集中的行。

有四种类型的API服务器游标:静态游标、动态游标、只读游标和键集驱动游标

完整的静态游标结果集将打开游标时创建的结果集存储在临时表中(静态游标始终是只读的)。 静态游标的特点是始终显示与打开游标时相同的结果集。 它不反映对数据库所做的更改,也不反映对结果集中的行的列值所做的更改。 打开游标后,数据库中不显示新插入的行。 构成结果集的行由其他用户更新,新数据值不显示在静态游标中。 但是,静态游标显示在打开游标后从数据库中删除的行。

动态游标静态游标相反,滚动游标时动态游标将反映结果集中的所有更改。 每次提取时,结果集中行数据的值、顺序和成员都会发生变化。

不支持只进游标滚动。 仅支持从光标开头到结尾提取数据行。 注:单插入游标还反映对结果集所做的所有更改。

键集驱动游标同时具有静态光标和动态光标的特点。 打开游标时,游标中的成员和行顺序是固定的,键集在打开游标时存储在临时工作表中。 对非键集列的数据值所做的更改将在用户光标滚动时显示。 打开游标后,插入到数据库中的行除非关闭游标,否则不会显示。

Transaction-SQL游标此游标基于Declare Cursor语法,主要用于Transaction-SQL脚本、存储过程和触发器。 Transaction-SQL游标在服务器上处理从客户端发送到服务器的Transaction-SQL语句。

要在存储过程或触发器中使用Transaction-SQL游标,请执行以下操作:

(1)声明Transaction-SQL变量包含光标返回的数据。 为每个结果集列声明变量。 声明一个变量,其大小足以保存列返回的值,并将变量类型声明为可以从数据类型隐式转换的数据类型。

)2)使用Declare Cursor语句将Transaction-SQL游标与Select语句相关联。 也可以使用Declare Cursor定义游标的只读、只读等特性。

)3)用Open语句执行Select语句以填充光标。

)4)使用Fetch Into语句提取各个行,将从各列得到的数据移动到指定的变量。 注:其他Transaction-SQL语句可以通过引用这些变量访问提取的数据值。 Transaction-SQL游标不支持行块提取。

)5)使用Close语句结束光标的使用。 注:关闭光标后光标仍然存在。 可以使用Open命令打开并继续使用。 只有在调用Deallocate语句时才能完全释放。

客户端游标此游标使用默认结果集将整个结果集缓存在客户端上,所有游标操作都在客户端的缓存中进行。

注意:客户端光标只支持入站光标和静态光标。 不支持其他光标。

使用游标的生命周期有五个阶段: 此外,光标的使用顺序也相同。

声明光标

(创建);打开游标;读取游标数据;关闭游标;释放游标。 1、声明游标

声明游标是为游标指定获取数据时所使用的Select语句,声明游标并不会检索任何数据,它只是为游标指明了相应的Select 语句。

在SQL Server中创建游标对象使用关键之declare(变量声明)以及curosr(游标)。

声明游标的参数

(1)Local与Global:Local表示游标的作用于仅仅限于其所在的存储过程、触发器以及批处理中、执行完毕以后游标自动释放。Global表示的是该游标作用域是整个会话层。由连接执行的任何存储过程、批处理等都可以引用该游标名称,仅在断开连接时隐性释放。

(2)Forward_only与Scroll:前者表示为只进游标,后者表示为可以随意定位。默认为前者。

(3)Static、Keyset与Dynamic: 第一个表示定义一个游标,其数据存放到一个临时表内,对游标的所有请求都从临时表中应答,因此,对该游标进行提取操作时返回的数据不反映对基表所作的修改,并且该游标不允许修改。Keyset表示的是,当游标打开时,键集驱动游标中行的身份与顺序是固定的,并把其放到临时表中。Dynamic表示的是滚动游标时,动态游标反映对结果集内所有数据的更改。

(4)Read_only 、Scroll_Locks与Optimistic:第一个表示的是只读游标,第二个表示的是在使用的游标结果集数据上放置锁,当行读取到游标中然后对它们进行修改时,数据库将锁定这些行,以保证数据的一致性。Optimistic的含义是游标将数据读取以后,如果这些数据被更新了,则通过游标定位进行的更新与删除操作将不会成功。

标准游标:

declare
MyCursor cursor
for select Name,ClassId from a_Students

只读游标

declare
MyCursor cursor
for SELECT s.Name,sc.ClassName FROM a_Students s
INNER JOIN a_StudentClass sc ON s.ClassId=sc.ClassId
For Read Only

可更新游标

declare
MyCursor cursor
for SELECT s.Name,sc.ClassName FROM a_Students s
INNER JOIN a_StudentClass sc ON s.ClassId=sc.ClassId
For UpDate

--声明(创建)游标对象(标准游标)declare MyCursor cursor for SELECT s.Name,sc.ClassName FROM a_Students sINNER JOIN a_StudentClass sc ON s.ClassId=sc.ClassId; 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 = 'xndxh111' 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 sINNER 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 MyCursorend 什么时候使用游标

深情的野狼要处理的结果集比较庞大,而你要对某一行或几行进行操作的时候,要考虑使用游标。

特别是对结果集中第几行进行行操作的时候,一般可以考虑使用游标。

但也不是唯一的方法,可以利用别的方法来替代,一般比较复杂的存储过程里面会出现游标的影子。

现存系统有一些游标,我们查询必须通过游标来实现
作为一个备用方式,当我们穷尽了while循环,子查询,临时表,表变量,自建函数或其他方式扔来无法实现某些查询的时候,使用游标实现.

游标使用的建议

游标用于按顺序遍历结果集。

但一般情况下,应尽量避免使用游标。

原因:

游标违背了关系模型,即按集合来考虑问题的思想;
游标逐行对纪录进行操作,会带来额外的开销,使用游标的解决方案通常比使用集合的解决方案要慢得多;
使用游标的解决方案,需要用很多代码来描述对游标的操作,因此代码更长,可读性更差,也更难以维护。
如果要使用,一定记住要记住:

用完之后一定要关闭和释放,尽量不要在大量数据上定义游标;
尽量不要使用游标上更新数据;
尽量不要使用insensitive, static和keyset这些参数定义游标;
如果可以,尽量使用FAST_FORWARD关键字定义游标;
如果只对数据进行读取,当读取时只用到FETCH NEXT选项,则最好使用FORWARD_ONLY参数。

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

欢迎关注订阅微信公众号【kddlc有话说】,更多好玩易学知识等你来取
作者:kddlc-学习中的苦与乐
公众号:kddlc有话说
出处1: https://www.cnblogs.com/xiongze520/p/14633171.html
出处2: https://blog.csdn.net/qq_35267585/article/details/115536445
创作不易,任何人或团体、机构全部转载或者部分转载、摘录,请在文章明显位置注明作者和原文链接。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。