走近SQL Server的游标

本文深入介绍了SQL Server中游标的使用方法,包括游标的基本概念、如何创建及使用游标遍历数据、以及如何利用游标进行数据的更新和删除操作等。适合初学者了解并掌握游标的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明!

陈希章

原文地址:http://www.cnblogs.com/chenxizhang/archive/2008/08/17/1269686.html
原文标题:走近SQL Server的游标
原文发表:2008/8/17 3:58:00

因为有的朋友不清楚游标到底是什么?以及为什么要用,和如何用?

这篇文章我将专门介绍这些内容

关系数据库中的操作会对整个行集产生影响。由 SELECT 语句返回的行集包括所有满足该语句 WHERE 子句中条件的行。由语句所返回的这一完整的行集被称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的结果集扩展。

游标通过以下方式扩展结果处理:

n 允许定位在结果集的特定行。

n 从结果集的当前位置检索一行或多行。

n 支持对结果集中当前位置的行进行数据修改。

n 为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。

n 提供脚本、存储过程和触发器中使用的访问结果集中的数据的 Transact-SQL 语句

游标的基本用法(遍历了Employee表中所有LastName以B开头的员工资料,这里完全就可以根据每次取到的值进行判断,然后进行相应的处理)


DECLARE Employee_Cursor CURSOR FOR

SELECT LastName, FirstName

FROM Northwind.dbo.Employees

WHERE LastName like 'B%'

declare @LastName varchar(100),@FirstName varchar(100)

OPEN Employee_Cursor

FETCH NEXT FROM Employee_Cursor into @LastName,@FirstName –如果有多个字段就输出到多个变量即可

WHILE @@FETCH_STATUS = 0

BEGIN

Print @LastName + '-' + @FirstName

FETCH NEXT FROM Employee_Cursor

END

CLOSE Employee_Cursor

DEALLOCATE Employee_Cursor

更新和删除记录

下面这个例子,对取出来的ID进行比较,如果大于1的话,就直接把这条记录删除掉。注意,这里用的条件是where current of demo_cursor,就是根据游标当前所在位置的行删除即可(假设:有一个表叫table1,里面有一个Int型的字段是ID)


declare demo_cursor cursor for

select ID from table1

declare @id int

open demo_cursor

fetch next from demo_cursor into @id

while @@fetch_status=0

begin

if @id>1

delete from table1 where current of demo_cursor –这句代码删除当前行

update table1 set ID=2 where current of demo_cursor—这句代码更新当前行的ID为2

fetch next from demo_cursor into @id

end

close demo_cursor

deallocate demo_cursor

select * from table1

总结

游标一般只应用在服务器的存储过程中,客户端的做法就直接可以遍历RecordSet了,语法也很类似。所以,实际上可以认为游标是RecordSet遍历的一种T-SQL实现。

(下面代码以ADO为例)

Dim rst as New ADODB.RecordSet

Rst.open “select * from Orders”,Connection,1,1

If not rst.EOF then

Do until rst.EOF

Dosomething here

Rst.moveNext

Loop

End if

Rst.close

作者:陈希章
出处:http://blog.youkuaiyun.com/chen_xizhang
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值