SQL Server 数据库的维护(四)__游标(cursor)
--维护数据库--
--游标(cursor)--
--概述:
注:使用select语句查询结果的结果集是一个整体,如果想每次处理一行或一部分行数据,游标可以提供这种处理机制。可以将游标理解为指针。指针指向哪条记录,哪条记录即是被操作记录。
游标处理结果集的方式:
1)允许定位在结果集的指定位置行。
2)从结果集的当前位置检索一行或一部分行记录。
3)支持对结果集当前位置做数据修改、删除等操作。
--使用游标
注:使用游标定位和操作数据记录的一般步骤为:声明游标、打开游标、抽取数据、关闭游标和释放游标。
--声明游标 (declare … cursor)
注:声明游标跟声明变量相似,用declare命令。
declare 游标名 cursor --declare表示声明游标名,cursor表示游标含义
[forward_only] [scroll] [read_only] [dynamic] --可选项forward_only表示游标为只进游标。可选项read_only定义游标为只读游标。可选项scroll表示可以使用所有抽取数据的选项。可选项dynamic表示游标结果集中的数据可以修改。
for select语句 [for update [of 字段名 [ , ...] ] ] --select语句指能够查询到结果集的查询语句,其中不能包含compute、compute by和into语句。要对结果集中做update修改操作时,可以使用of字段名来指明允许被修改的字段名,如果不使用of指定字段名,则所有字段都修改。
--打开游标
open 游标名 --open命令表示打开。“游标名”必须是已定义的、且没有在使用的游标。刚打开游标,指针指向结果集中第一条记录之前。
全局标量@@error可以判断游标是否打开成功,如果返回0只则说明成功,否则失败。
全局变量@@cursor_rows可以返回被打开的游标中记录个数。
--抽取游标
fetch [first | prior | next | last | absolute {n|@变量} | relative {n|@变量} ] --fetch命令表示抽取数据,一次只能抽取一条记录。
[from] 游标名 [into @变量名 [, ...] ] --into@变量名,...把抽取出的字段值赋值给指定变量,然后使用。
--first命令用来抽取结果集中的第一条记录,并定位指针。
--prior命令用来抽取当前记录的前一条记录,并定位指针。如果当前记录为结果集中的第一条记录,prior命令则使指针上移至第一条记录上方,并不会抽取结果。
--next命令用来抽取当前记录的后一条记录,并定位指针。新打开的数据库使用next抽取出结果集中第一行记录。如果结果集中最后一行记录为当前记录,next则使指针指向最后一条记录下方,并不会抽取出结果。
--last命令用来抽取结果集中的最后一条记录,并定位指针。
--absolute {n|@变量},当n(或@变量)为正数时,返回结果集中从头开始的第n(或@变量)条记录,并定位指针;当n(或@变量)为负数时,返回结果集中从末尾开始的第n(或@变量)条记录,并定位指针。
--relative {n|@变量},当n(或@变量)为正数时,返回结果集中从当前行开始向下的第n(或@变量)条记录,并定位指针;当n(或@变量)为负数时,返回结果集中从末尾开始的第n(或@变量)条记录,并定位指针。
--可以使用全局变量@@fetch_status的值来判断fetch命令是否抽取到数据。值为0表示抽取到记录;值为-1表示指针指向结果集最后一条记录下方;值为-2表示抽取操作存在问题。
--关闭游标
close 游标名 --游标关闭后不能使用fetch命令抽取游标中的记录,除非再次使用open命令(打开)重新打开。
--释放游标
deallocate 游标名 --被释放后的游标不能再使用open命令打开使用,除非使用declare命令(声明)重新定义。
例:(***下面是一个帮助理解的案例***)(逐条查看“商品管理数据库”的“销售信息表”中2012年12月20日的销售信息) use 商品管理数据库 go set nocount on --声明游标 declare c_销售表_日期 cursor for select 商品信息表.商品编号,商品信息表.商品名称,销售金额 from 商品信息表,销售信息表 where 商品信息表.商品编号=销售信息表.商品编号 and 销售日期='2012-12-20' --打开游标 open c_销售表_日期 --抽取数据 begin print '=====2012年12月20日销售信息=====' declare @pdno nchar(8),@pdname nvarchar(10), @salemoney decimal(17,2) --抽取第一条记录,并将抽取到的变量赋值给相应变量 fetch next from c_销售表_日期 into @pdno,@pdname,@salemoney --使用全局变量@@fetch_status值是否为0作为循环判断条件,检验是否抽取到记录,如抽取到就在循环体内输出抽取到的值, --再继续使用fetch命令抽取数据,直到@@FETCH_STATUS的值不为0为止 while(@@FETCH_STATUS=0) begin print '商品编号:'+@pdno+' 商品名称:'+@pdname+' 销售金额:'+convert(nchar(25),@salemoney) fetch next from c_销售表_日期 into @pdno,@pdname,@salemoney end end --关闭游标 close c_销售表_日期 --释放游标 deallocate c_销售表_日期 set nocount off go
理解例子
注:"--"可看成说明或者注释文本
SQL Server 数据库的维护(四)__游标(cursor)的更多相关文章
- SQL Server 数据库的维护(三)__事务(transaction)和锁
--维护数据库-- --事务(transaction)和锁-- --事务(transaction)-- --概述: 事务是指封装了一组T-SQL语句的单个逻辑单元.单元中的所有语句作为一个整体,在满足 ...
- SQL Server 数据库的维护(二)__触发器
--维护数据库-- --触发器-- --概述: 触发器是一种特殊类型的存储过程,用来强制执行业务规则.在调用执上,触发器不能像存储过程那样可以由用户通过T-SQL语句直接调用,而是需要有数据库所发生的 ...
- SQL Server 数据库的维护(一)__存储过程(procedure)
--维护数据库-- --存储过程(procedure)-- --概述: SQl Serve的存储过程是由一个或多个T-SQL语句组成的一个集合.常用的程序代码段通常被创建成存储过程,一次创建多次调用, ...
- 【2017-03-09】SQL Server 数据库基础、四种约束
一.数据库和内存的区别 数据库:一些存储在硬盘上的数据文件 内存:计算机临时存储的一些数据 二.常用数据库 .Net - SQL Server PHP - MySql Java - Oreacl 三. ...
- 5、SQL Server数据库、T-SQL
SQL Server数据库基础 一.安装SQL Server数据库 setup.exe->安装->全新SQL Server独立安装或向现有安装添加功能->输入序列号->下一步- ...
- SQL Server - 数据库初识
在互联网笔试中,常遇到数据库的问题,遂来简单总结,注意,以 Sql Server 数据库为例. 数据库 数据库系统,Database System,由数据库和数据库管理系统组成. 数据库,Data ...
- 转载 50种方法优化SQL Server数据库查询
原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1 ...
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
- SQL Server数据库 优化查询速度
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...
随机推荐
- AngularJs之$scope对象(作用域)
一.作用域 AngularJs中的$scope对象是模板的域模型,也称为作用域实例.通过为其属性赋值,可以传递数据给模板渲染. 每个$scope都是Scope类的实例,Scope类有很多方法,用于 ...
- 从数据库中导出excel报表
通常需要将后台数据库中的数据集或者是其他列表等导出excel 报表,这里主要引用了Apose.cells dll 类库, (1)直接上主要代码: protected void txtExport_Cl ...
- Hash校验
在项目的建设方案中,都会提到数据的安全性,数据的安全性其中又包括数据的完整性和数据保密性, 1. 数据完整性 通过使用Hash校验的方法确保数据的完整性: 传输过程的完整性受到损坏则采取数 ...
- 线程优先级抢占实验【RT-Thread学习笔记 3】
同时处于就绪状态的线程,优先级高的先执行. 高优先级就绪时,低优先级任务让出CPU,让高优先级任务先执行. 创建两个任务函数: //线程优先级抢占 void thread1_entry(void *p ...
- 可扩展Web架构与分布式系统(转)
1.1. web分布式系统的设计原则 搭建和运营一个可伸缩的web站点或者应用程序意味着什么?在原始层面上这仅仅是用户通过互联网连接到远程资源-使系统变得可伸缩的部分是将资源.或者访问的资源,分布于多 ...
- 转,SelectNodes + XPath
XPath 是 XML 的内容,这里 SelectNodes 是 C# 中 XmlDocument 或 XmlNode 的一个方法.SelectNodes 使用 XPath 来选取节点. 重要语法 S ...
- 如何彻底卸载Oracle
如何彻底卸载Oracle 因为Oracle在Windows下的卸载颇有一些麻烦,如果不能完全卸载有可能影响将来的再次安装!常规卸载方法是运行Oracle的自带的卸载程序,可遗憾的是我在卸载时总不能完全 ...
- 【IL】IL生成exe的方法
1.将ilasm.exe和fusion.dll用everything找出来,然后复制到system32文件夹 2.执行:ilasm /res:code.res code.il /out:code.ex ...
- java中的运算符
1. 赋值运算符: (=) 2. 算术运算符: (+ ,- , * , /, %) 3. 逻辑运算符: (&& ,||, !) 4. 关系 ...
- php使用saop简单例子和注意事项
首先配置下PHP的soap环境支持: 找到php.ini文件:extension=php_soap.dll :always_populate_raw_post_data = -1 删除掉": ...