因为有的朋友不清楚游标到底是什么?以及为什么要用,和如何用?
这篇文章我将专门介绍这些内容
关系数据库中的操作会对整个行集产生影响。由 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