找回密码
 注册账号

QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

初学者课程:T3自学|T6自学|U8自学软件下载课件下载工具下载资料:通资料|U8资料|NC|培训|年结积分规则 | 使用常见问题Q&A
知识库:U8 | | NC | U9 | OA | 政务U8|U9|NCC|NC65|NC65客开|NCC客开新手必读 | 任务 | 快速增金币用友QQ群[微信群]
查看: 3107|回复: 1

[数据库知识] Sql server中游标的介绍

[复制链接]
发表于 2008-9-12 11:02:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

×
此文为转载文章http://www.cnblogs.com/james.wong/archive/2005/11/23/93946.html


相信各位都已经是Access老手了吧?如果有人问,更新记录有多少种方法,你肯定会说:方法多了,不过无非就是用指针一条一条更新和用sql语句一批一起更新而已。
虽然你熟悉了用ado.recordset的 movenext....方法来操作游标进行一条一条记录的更新,但是 sql server 中也有类似的功能你掌握了吗?
好了,让我们来介绍一下 sql server 中如何操作游标吧:

游标的基本用法:
1.宣告游标:以 DECLARE 语法命名一个游标变量。依照需求,如游标所使用的数据若有别人同时会使用,游标所显示的数据是否要自动显示别人的变更,或是游标移动的方式等等来设定游标的型态。接着定义 SELECT 语法以设定游标的数据集合范围,通常会以 ORDER BY 子句设定数据排序的方式。SQL Server 的游标依照设定,可以提供前后移动以及可更新数据的游标型态。
2.开启游标:以 OPEN 语法开启
3.Fetch 在游标范围内的记录:当 Fetch 到某一笔记录时,光标记录就停在该笔记录上。你可以 Fetch 上一笔记录、下一笔记录、第一笔、最后一笔以及某特定的一笔等等。一般来说,FETCH 语法会在使用游标时一再被使用到。在 SQL Server 内,你可以在每一次 FETCH 动作后检查公共变量 @@FETCH_STATUS 的值来确定是否有找到符合的资料。说明如下表
值      
0    FETCH 成功
-1    没有数据,也就是游标移出了数据集合的范围,不管是移到第一笔之前和是最后一笔之后。
-2    该笔记录不再存在于游标的数据集合之内。有可能基础数据表上的记录在游标开启之后被其它人修改果,使得该记录不再符合开启游标时所定的条件。
4. 修改/删除游标所在位置的记录:这个动作是选择性的,语法如下
UPDATE/DELETE table WHERE CURRENT OF cursor_name
透过 WHERE CURRENT OF 的设定,你可以修改/删除光标所在位置的记录
5.关闭游标:使用 CLOSE 语法来关闭光标。关闭光标会结束光标的活动,但光标还是存在,所以你可以重新开启它而不必重新宣告。
6.释放掉游标:因为内部维护光标机制的数据结构会消耗掉内存,所以当你使用完光标时应该用 DEALLOCATE 语法释放掉光标。  

代码如下:

DECLARE @AuName VARCHAR(50) --宣告接受游标传回的值的变量
--宣告光标变量
DECLARE curAuName CURSOR FOR SELECT au_fname + ' ' + au_lname FROM authors ORDER BY au_id



OPEN curAuName --开启游标
FETCH NEXT FROM curAuName INTO @AuName --以一笔笔的方式存取集合内的记录,将找到的数据放入变量 @AuName之内
WHILE(@@FETCH_STATUS=0) --直到找不到数据才停止找寻下一笔的动作
BEGIN
    SELECT @AuName
    FETCH NEXT FROM curAuName INTO @AuName
END

CLOSE curAuName --关闭游标
DEALLOCATE curAuName --释放游标



最后再提醒的一点是:能够用 sql 语句一次性解决的更新千万不要用游标一条一条来解决!
发表于 2008-9-13 10:48:32 | 显示全部楼层
呵呵支持一下不过这些是基础的知识
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|站长微信|Archiver|手机版|小黑屋|用友之家 ( 蜀ICP备07505338号|51072502110008 )

GMT+8, 2024-11-24 08:58 , Processed in 0.054716 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表