SQLServer中游标是如何处理数据的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLServer中游标是如何处理数据的?相关的知识,希望对你有一定的参考价值。

游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

1.游标的组成

游标包含两个部分:一个是游标结果集、一个是游标位置。

游标结果集:定义该游标得SELECT语句返回的行的集合。游标位置:指向这个结果集某一行的当前指针。

2.游标的分类

游标共有3类:

  1. API服务器游标
  2. Transaction-SQL游标
  3. API客户端游标。

其中前两种游标都是运行在服务器上的,所以又叫做服务器游标。

API服务器游标

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

  1. 打开一个连接。
  2. 设置定义游标特征的特性或属性,API自动将游标影射到每个结果集。
  3. 执行一个或多个Transaction-SQL语句。
  4. 使用API函数或方法提取结果集中的行。

API服务器游标包含以下四种:静态游标、动态游标、只进游标、键集驱动游标(Primary key)

  • 静态游标的完整结果集将打开游标时建立的结果集存储在临时表中,(静态游标始终是只读的)。静态游标具有以下特点:总是按照打开游标时的原样显示结果集;不反映数据库中作的任何修改,也不反映对结果集行的列值所作的更改;不显示打开游标后在数据库中新插入的行;组成结果集的行被其他用户更新,新的数据值不会显示在静态游标中;但是静态游标会显示打开游标以后从数据库中删除的行。
  • 动态游标与静态游标相反,当滚动游标时动态游标反映结果集中的所有更改。结果集中的行数据值、顺序和成员每次提取时都会改变。
  • 只进游标不支持滚动,它只支持游标从头到尾顺序提取数据行。注意:只进游标也反映对结果集所做的所有更改。
  • 键集驱动游标同时具有静态游标和动态游标的特点。当打开游标时,该游标中的成员以及行的顺序是固定的,键集在游标打开时也会存储到临时工作表中,对非键集列的数据值的更改在用户游标滚动的时候可以看见,在游标打开以后对数据库中插入的行是不可见的,除非关闭重新打开游标。

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语句才会完全释放。

客户端游标

该游标将使用默认结果集把整个结果集高速缓存在客户端上,所有的游标操作都在客户端的高速缓存中进行。注意:客户端游标只支持只进和静态游标。不支持其他游标。

转载自:http://www.aspnetjia.com

以上是关于SQLServer中游标是如何处理数据的?的主要内容,如果未能解决你的问题,请参考以下文章

源码解析Flink 是如何处理迟到数据

spring saml:LOGOUT 是如何处理的?是不是必须在 IDP 元数据 xml 中有注销端点?

注销哈希,它们是如何处理的?

iOS - 我很困惑这里是如何处理内存的?

国际用户访问美国服务器的 MySQL 数据库问题。这通常是如何处理的?

Lua 表在内存中是如何处理的?