SQL Server之游标的基础知识

SQL Server之游标的基础知识

什么是游标: 游标是可以在结果集中上下游动的指针。游标的作用: --允许定位到结果集中的特定行。 --从结果集的当前位置检索一行或多行数据。 --支持对结果集中当前位置的行进行修改。注意:游标虽然很好用,但是如果滥用游标的话,会对程序的性能造成很大影响,使用的时候一定要谨慎啊!游标的种类:MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标。 (1) Transact_SQL 游标 Transact_SQL 游标是由declare cursor语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。 Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。 (2) API 游标 API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。 每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。 (3) 客户游标 客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。 客户游标仅支持静态游标而非动态游标。 由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。 因为在一般情况下,服务器游标能支持绝大多数的游标操作。 由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。游标的使用方法: 使用游标有四种基本的步骤:声明游标、打开游标、提取数据、关闭游标。 声明一个游标 国际标准语句(ISO Syntax):declare cursor_name { [insensitive ]| [scroll] } cursor for sql_sentence [ for{ read only | update[ of column_name [ ,...n ] ] } ]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 ] ] ]insensitive 定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的这一临时表中得到应答; 因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。 使用国际语法时,如果省略 insensitive ,则已提交的(任何用户)对基础表的删除和更新则会反映在后面的提取操作中。scroll 指定所有的提取选项(first、last、prior、next、relative、absolute)均可用。 如果未在 ISO declare cursor 中指定 scroll,则 next 是唯一支持的提取选项。 如果也指定了 fast_forward,则不能指定 scroll。read only禁止通过该游标进行更新。在 update或 delete语句的 where current of 子句中不能引用该游标。该选项优于要更新的游标的默认功能。update[ of column_name [ ,...n ] ] 定义游标中可更新的列。如果指定了 of column_name [,...n],则只允许修改所列出的列。如果指定了 update,但未指定列的列表,则可以更新所有列。local指定对于在其中创建的批处理、存储过程或触发器来说,该游标的作用域是局部的。该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程 output参数中,该游标可由局部游标变量引用。output参数用于将局部游标传递回调用批处理、存储过程或触发器,它们可在存储过程终止后给游标变量分配参数使其引用游标。除非 output参数将游标传递回来,否则游标将在批处理、存储过程或触发器终止时隐式释放。如果 output参数将游标传递回来,则游标在最后引用它的变量释放或离开作用域时释放。global指定该游标的作用域对来说连接是全局的。在由连接执行的任何存储过程或批处理中,都可以引用该游标名称。该游标仅在断开连接时隐式释放。forward_only指定游标只能从第一行滚动到最后一行。fetch next 是唯一支持的提取选项。如果在指定forward_only时不指定 static、keyset和dynamic 关键字,则游标作为 dynamic 游标进行操作。如果forward_only和 scroll均未指定,则除非指定 static、keyset或dynamic 关键字,否则默认为forward_only。static、keyset和dynamic 游标默认为scroll。与 ODBC 和 ADO 这类数据库 API 不同,static、keyset或dynamic Transact-SQL 游标支持 forward_only。static定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。keyset指定当游标打开时,游标中行的成员身份和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。dynamic定义一个游标,以反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持 absolute 提取选项。fast_forward指定启用了性能优化的 forward_only、read_only 游标。如果指定了scroll或for_update,则不能也指定fast_forward。

相关推荐

纵情直播
bt365最新网站

纵情直播

📅 07-07 👁️ 7668
Java 8,如何对 ArrayList 元素进行排序?
365速发登录入口

Java 8,如何对 ArrayList 元素进行排序?

📅 07-06 👁️ 5930
如何在 Windows 10 中查找家庭组密码 ▷➡️
365速发登录入口

如何在 Windows 10 中查找家庭组密码 ▷➡️

📅 07-03 👁️ 4663