走近SQL Server的游标

时间:2021-03-17 13:27:22

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

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

关系数据库中的操作会对整个行集产生影响。由 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