SqlServer——游标
参考:http://www.cnblogs.com/94cool/archive/2010/04/20/1715951.html
http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html
一、游标的基础知识
游标是。我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
游标包含两个部分:一个是游标结果集、一个是游标位置。
游标结果集:定义该游标得SELECT语句返回的行的集合。游标位置:指向这个结果集某一行的当前指针。
使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。
1、声明游标 :DECLARE <游标名> [INSENSITIVE] [SCROLL] CURSORFOR<SELECT语句>
简单声明方式:DECLARE <游标名>CURSOR FOR<SELECT语句>
- INSENSITIVE :表明MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。
另外应该指出,当遇到以下情况发生时,游标将自动设定INSENSITIVE 选项。
a.在SELECT 语句中使用DISTINCT、 GROUP BY、 HAVING UNION 语句;
b.使用OUTER JOIN;
c.所选取的任意表没有索引;
d.将实数值当作选取的列。
- SCROLL :表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用该保留字,那么只能进行NEXT 提取操作。由此可见,SCROLL 极大地增加了提取数据的灵活性,可以随意读取结果集中的任一行数据记录,而不必关闭再重开游标。
- NEXT :游标指针指向下一行。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项;
- PRIOR :上一行;
- FIRST:第一行;
- LAST :最后一行;
- ABSOLUTE(n):直接跳到第n行;
- RELATIVE(n):相对于目前跳几行,n>0则向下移动n行;n<0则向上移动n行;
2、 打开游标
OPEN 游标名
3、读取数据
FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]
- INTO @变量名[,…] 将游标指向的行数据取出赋给局部变量。列表中的各个变量从左到右要与与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。
4、关闭游标
CLOSE 游标名
5、释放游标
DEALLOCATE 游标名
6、@@fetch_status全局变量:返回针对连接当前打开的任何游标发出的最后一条游标 FETCH 语句的状态;
- 0: FETCH 语句成功
- -1:FETCH 语句失败或此行不在结果集中
- -2: 被提取的行不存在
二、示例:
步骤:
- 声明变量,用于保存游标取出的数据;
- 声明游标;
- 打开游标;
- 从游标取数赋给之前声明的变量;
- 对变量的数据进行操作;
- 关闭游标;
- 释放游标;
例:
create proc NK_FXSLTJ
as
declare @LCMC varchar(60), @num numeric --声明游标需要使用的变量
declare My_Cursor2 cursor --声明游标
for (select NKFXJZ_FXZ,NKLCK_MC from NKFXJZ join NKFXJZMX on NKFXJZMX_JZNM=NKFXJZ_NM join
NKJZZZMX on NKJZZZMX_FXJZMX =NKFXJZMX_NM JOIN NKLCK ON NKLCK_NM =NKJZZZMX_LCNM )
open My_Cursor2; --打开游标
fetch next from My_Cursor2 into @num,@LCMC; --移动游标
while @@FETCH_STATUS =0 --判断 FETCH 语句是否成功
begin
if @num>=3.5 and @num<=5
update SLTJ set GFX=GFX+1 where LCKMC=@LCMC
else if @num>2 and @num<3.5
update SLTJ set ZFX=ZFX+1 where LCKMC=@LCMC
else if @num>=0 and @num<=2
update SLTJ set DFX=DFX+1 where LCKMC=@LCMC
fetch next from My_Cursor2 into @num,@LCMC; --移动游标
end
close My_Cursor2; --关闭游标
deallocate My_Cursor2; --释放游标
select LCKMC ,GFX ,ZFX ,DFX from SLTJ
SqlServer——游标的更多相关文章
- Sqlserver游标复习
经常写存储过程,但今天在游标使用过程中还是疏忽了一些事情,执行过程中一直执行不下去,后来直接sqlserver挂了,教训啊! 代码虽简单,望铭记: Create PROCEDURE [dbo].[te ...
- SqlServer游标的创建与使用
前言 大家都对SqlServer视图.存储过程.触发器的创建与使用有一定的了解了,我们来看下什么是游标,怎么使用,什么时候用. SqlServer视图的创建与使用 SqlServer存储过程的创建与使 ...
- sqlserver 游标的使用
declare @temp_temp uniqueidentifier--临时变量 DECLARE aaa CURSOR for select Id from A ------------------ ...
- SqlServer游标简介
游标实例: Declare MyCusror Cursor Scroll For Select * From Master_Goods Order By GoodsID Ope ...
- sqlserver 游标
DECLARE ChangeInvCodeCursor CURSOR FOR SELECT A.name AS tablecolumn,C.name AS tablename FROM sys.col ...
- SQLServer游标(Cursor) (B)
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力.我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许 ...
- SQLServer 游标 (A)
游标 游标分为客户端游标和服务器端游标.Sql通过游标可以对一个结果集进行逐行处理.对于使用服务器端游标的过程有:声明.打开.读取.关闭.释放. 1 声明游标 1.1 SQL-92标准的声明 Decl ...
- SQLserver游标原理和使用方法
在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录.那么如何解决这种问题呢 ...
- (转)sqlserver游标概念与实例全面解说
首先声明:该文章转自http://www.cnblogs.com/wudiwushen/archive/2010/03/30/1700925.html 的博客 引言 我们先不讲游标的什么概念,步骤 ...
- SQLServer游标详解
一.游标概念 我们知道,关系数据库所有的关系运算其实是集合与集合的运算,它的输入是集合输出同样是集合,有时需要对结果集逐行进行处理,这时就需要用到游标.我们对游标的使用一本遵循“五步法”:声明游标—& ...
随机推荐
- QT 中一些数学计算函数
QT的一些範例中有出現 qmax, qmin 等 math函式的身影,但我在官方文件中卻找不到與 math函式相關的說明,所以我就把函式的source裡面提供的方法整理條列,並且看看還有哪些 math ...
- numpy nonzero与isnan
nonzero 直接看例子: In [83]: x = np.array([[1,0,0], [0,2,0], [1,1,0]]) In [84]: x.shape Out[84]: (3L, 3L) ...
- jsp:jstl标签forTokens
forTokens 标签这个标签的作用和 Java 中的 StringTokenizer 类的作用非常相似,它通过 items 属性来指定一个特定的字符串,然后通过 delims 属性指定一种分隔符( ...
- DH01-简单工厂模式
模式简介 简单工厂模式又称静态工厂方法模式,定义一个用于创建对象的接口.其主要组成部分为: 工厂类角色:模式的核心,具有一定的商业逻辑和判断逻辑.如示例中的类AnimalSpecies 抽象产品角色: ...
- 你妹的IOS7
第一时间升级到了IOS7,想体验一把,界面卡就算了,付费的软件闪退也就罢了,耗电发烫也算球了!你妹的,连个电话都打不了了,刚说几句话就黑屏了,要你还有啥用了,果断降级,IOS6已经下载完了,刷机去!
- Highcharts中更新series的5种方法
用Highcharts画图时,经常需要更新所画的图表,最常见的就是改变数据以更新图表.在Highcarts中,数据对应的参数是series.这儿就以图1的柱状图为例,列举如何更新series的5种方法 ...
- Django 基础 ORM系统
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- Tomcat_总结_01_tomcat环境搭建
一.准备条件 1.安装jdk 二.安装tomcat 1.下载tomcat 去官网下载 64-bit Windows zip 版本的tomcat,并解压 https://tomcat.apache. ...
- github提交代码时遇到”Everything up-to-date“问题的解决方式
需要创建一个新分支,将最新代码加入新分支, 再将新分支合并到主分支,然后提交主分支代码到github网站. ---------------------------------------------- ...
- 重构代码 —— 函数即变量(Replace temp with Query)
函数即变量,这里的函数指的是返回值为某一对象的函数.Replace temp with query,query 是一种查询函数. example 1 double price() { return t ...