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。

注意:在 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

 

时间: 2024-10-22 02:26:28

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

一步一步学SQL Server BI 1:基础知识

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; SQL Server 2005 和2008提供了很多新的和增强的商务智能功能,包括利用集成服务(SSIS)整合多种数据源;利用分析服务(SSAS)使数据内容更丰富并且建立复杂的商业分析; 以及利用报表服务(SSRS)编辑,管理,和提交丰富的报表. 如果你现在还不清楚这些功能,那么接下来一系列的介绍会让你对SQL Server现在的商务智能支持大吃一惊.不过现在关于S

SQL Server调优系列基础篇

原文:SQL Server调优系列基础篇 前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过本篇了解如何阅读和理解查询计划.并且列举一系列最常用的查询执行运算符. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析.  一.区别不同的运算符 在所有T-SQL语句在执行的时候,都会将语句分解

SQL Server调优系列基础篇(常用运算符总结)

原文:SQL Server调优系列基础篇(常用运算符总结) 前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握. 通过本篇可以了解我们平常所写的T-SQL语句,在SQL Server数据库系统中是如何分解执行的,数据结果如何通过各个运算符组织形成的. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 一.数据连接 数据连接是我们在写T-SQL语

简述SQL Server 2005数据库镜像相关知识_mssql2005

SQL Server 数据库中,数据库镜像是用于提高数据库可用性的主要软件解决方案.数据库镜像基于每个数据库实现,并且只适用于使用完整恢复模式的数据库.简单恢复模式和大容量日志恢复模式不支持数据库镜像,数据库镜像不能镜像master.msdb.tempdb 或 model 数据库.本文我们主要就介绍一下数据库镜像的相关知识,接在来就让我们来一起了解一下吧! 数据库镜像维护一个数据库的两个副本,这两个副本必须驻留在不同的SQL Server 数据库引擎实例(服务器实例)上.通常,这些服务器实例驻留

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

原文:SQL Server调优系列基础篇(子查询运算总结) 前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴趣的童鞋可以点击查看. 本篇我们介绍关于子查询语句的一系列内容,子查询一般是我们形成复杂查询的一些基础性操作,所以关于子查询的应用方式就非常重要. 废话少说,开始本篇的正题. 技术准备 数据库版本为SQL Server2008R2,利用微软

sql注入之必备的基础知识_数据库其它

什么是SQL注入(SQL Injection) 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击. mysql常用注释     #     --[空格]或者是--+     /*-*/ 在注意过程中,这些注释可能都需要进行urlencode. mysql认证绕过       ;%00     

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

原文:SQL Server调优系列基础篇(联合运算符总结) 前言 上两篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符的优化技巧,本篇我们总结联合运算符的使用方式和优化技巧. 废话少说,直接进入本篇的主题. 技术准备 基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 一.联合运算符 所谓的联合运算符,其实应用最多的就两种:UNION ALL和UNION. 这两个运算符用法很简单,前者是将两个数据集结果合并,后者则是合并后进行去重操

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

原文:SQL Server调优系列基础篇(并行运算总结) 前言 上三篇文章我们介绍了查看查询计划的方式,以及一些常用的连接运算符.联合运算符的优化技巧. 本篇我们分析SQL Server的并行运算,作为多核计算机盛行的今天,SQL Server也会适时调整自己的查询计划,来适应硬件资源的扩展,充分利用硬件资源,最大限度的提高性能. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 一.并

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

原文:SQL Server调优系列基础篇(并行运算总结篇二) 前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析. 内容 文章开始前,我们先来回顾上一篇中介绍的并行运算,来看文章最后介绍的并行运算语句: SELECT B1.[KEY],B1.DATA,B2.DATA FROM BigTa