什么是游标: 游标是可以在结果集中上下游动的指针。

游标的作用: --允许定位到结果集中的特定行。 --从结果集的当前位置检索一行或多行数据。 --支持对结果集中当前位置的行进行修改。 注意:游标虽然很好用,但是如果滥用游标的话,会对程序的性能造成很大影响,使用的时候一定要谨慎啊!

游标的种类: 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。

注意:在 SQL Server 2000 中,FAST_FORWARD 和 FORWARD_ONLY 游标选项是互相排斥的。 如果指定了二者,则会引发错误。在 SQL Server 2005 及更高版本中,这两个关键字可以用在同一个 DECLARE CURSOR 语句中。

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

optimistic 指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。 当将行读入游标时,SQL Server 不锁定行。 它改用 timestamp 列值的比较结果来确定行读入游标后是否发生了修改,如果表不含 timestamp 列,它改用校验和值进行确定。 如果已修改该行,则尝试进行的定位更新或删除将失败。如果还指定了fast_forward,则不能指定optimistic。

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

打开游标: open cursor_name 由于打开游标是对数据库进行一些SQL SELECT的操作,它将耗费一段时间,主要取决于您使用的系统性能和这条语句的复杂程度。

提取游标:

fetch ** from cursor_name into 变量

当用OPEN语句打开了游标并在数据库中执行了查询后,您不能立即利用在查询结果集中的数据。

您必须用FETCH语句来取得数据。 一条FETCH语句一次可以将一条记录放入程序员指定的变量中。 

--fetch first:提取游标的第一行。

--fetch next:提取上次提取的行的下一行。

--fetch prior:提取上次提取的行的前一行。

--fetch last:提取游标中的最后一行。

--fetch absolute n:

-- 如果n 为正整数,则提取 游标中的第n行

-- 如果n为负整数,则提取游标最后一行之前的第n行

-- 如果n 为0,则不提取任何行

--fetch relative n :

-- 如果n为正,则提取上次提取的行之后的第n行。

-- 如果n为负,则提取上提取的行之前的第n行。

-- 如果n为0,则再次提取同一行

@@fetch_status,返回针对连接当前打开的任何游标发出的上一条游标 fetch语句的状态。  0  fetch语句成功 -1  fetch语句失败或行不在结果集中 -2  提取的行不存在

关闭游标 close cursor_name 删除游标资源,释放内存 deallocate  cursor_name

一个简单的游标示例:

create proc pro_cursor
as
begin
--声明一个全局游标
declare mycursor cursor for
select sid from score
--打开游标
open mycursor
--声明一个变量
declare @sid int
--循环移动
fetch next from mycursor into @sid
while(@@fetch_status=0)
begin
update score set score=score+10
where sid=@sid
fetch next from mycursor into @sid
end
close mycursor
deallocate mycursor
end

原文:http://www.cnblogs.com/jiajiayuan/archive/2011/07/14/2106341.html

SQL Server之游标的基础知识的更多相关文章

  1. [SQL]SQL Server数据表的基础知识与增查删改

    SQL Server数据表的基础知识与增查删改 由张晨辉(学生) 于19天 前发表 | 阅读94次 一.常用数据类型 .整型:bigint.int.smallint.tinyint .小数:decim ...

  2. sql server使用的相关基础知识

    1.表的管理--表和列的命名 必须以字母开头 长度不能超过128字符 不要使用sql server的保留字 只能使用如下字符A-Z,a-z,0-9,$,#,_等等 2.表的管理--支持的数据类型 字符 ...

  3. SQL Server调优系列基础篇(常用运算符总结——三种物理连接方式剖析)

    前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL ...

  4. SQL Server调优系列基础篇(联合运算符总结)

    前言 上两篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符的优化技巧,本篇我们总结联合运算符的使用方式和优化技巧. 废话少说,直接进入本篇的主题. 技术准备 基于SQL Server200 ...

  5. SQL Server调优系列基础篇(并行运算总结)

    前言 上三篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符.联合运算符的优化技巧. 本篇我们分析SQL Server的并行运算,作为多核计算机盛行的今天,SQL Server也会适时调整自 ...

  6. SQL Server调优系列基础篇(并行运算总结篇二)

    前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...

  7. SQL Server调优系列基础篇(索引运算总结)

    前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方 ...

  8. SQL Server调优系列基础篇(子查询运算总结)

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  9. SQL Server调优系列基础篇 - 子查询运算总结

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

随机推荐

  1. C阶段【01】 - C基础

    一.进制 进位方法:逢几进一(也就是几进制) 举例:十进制 12  :  二进制  0b(计算机前缀)  0b1011  :  八进制  0   073  :十六进制  0x  0xABCDEF 十进 ...

  2. CEF3可行性

    Chromium Embedded Framework 顾名思义,内嵌式CHROME,详细的介绍参阅 http://yogurtcat.com/posts/cef/hello-cef.html 为什么 ...

  3. SVN导出/导入、SVN备份/还原 【小白版】

    一.导出: 1.进入svn安装路径bin文件夹下,使用 cd 命令. 在windows下,win+R 键入 cmd 回车 打开命令窗口cmd,进入下列目录(svn服务器安装目录bin): " ...

  4. 14、SEO工程师要阅读的书籍 - IT软件人员书籍系列文章

    SEO工程师是Web项目中比较重要的一个角色.他主要负责网站的针对搜索引擎的优化方案的编写和实施.因为现在网站数量庞大,在全世界的这么多网站当中,想要让用户访问你的网站,就需要一些技巧性的内容.很多用 ...

  5. Oracle BIEE 环境迁移所导致的账号登陆问题的解决

    系统版本 系统版本:11G(11.1.1.9) 问题描述 将系统数据(RPD.catalog等数据)迁移到另一环境(版本同样为11G)后,老系统weblogic控制台中添加的账户在新系统(仪表盘)中无 ...

  6. Centos中jdk的环境配置

    在Centos中,进行配置jdk的环境,这个还是折腾了我听挺久的.特别是,在一次配置中,导致后来我的root用户无法登录,并且用其他普通用户登录,使用su - root切换到root用户,都无法使用l ...

  7. 优化SQLServer——表和分区索引

    概念: 简单地说,分区是将大型的对象(如表)分成更小的且易于管理的小块.分区的基本单位是行,需要注意的是与分区视图不同的地方时,分区必须位于同一个数据库内. 分区的原因:            对于非 ...

  8. 用自己的算法实现startsWith和endsWith功能。

    String str=new String(); str="erty"; Scanner sc= new Scanner(System.in); System.out.printl ...

  9. 无法连接到WMI提供程序 三种解决办法

    无法连接到WMI 提供程序 请注意,你只能使用SQL Server 配置管理器来管理SQL Server 2005服务器.找不到指定的模块.[0x8007007e] 解决方案1: 检查一下 windo ...

  10. 烂泥:学习Nagios(二):Nagios配置

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 nagios安装完毕后,我们现在就来配置nagios.有关nagios的安装,可以参考<烂泥:学习Nagios(一):Nagios安装>这篇文 ...