数据库指针类似于字处理程序中的指针.数据库游标允许你选择一组数据,通过翻阅这组数据记录(通常被称为数据集)检查每一个游标所在的特定的行.你可以将游标和局部变量组合在一起对每一个记录进行检查,当游标移动到下一个记录时来执行一些外部操作.
    游标的另一个常见的用法是保存查询结果以备以后使用,一个游标结果集是通过执行SELECT 查询来建立的.如果你的应用程序或过程需要重复使用一组记录,那么第一次建立游标以后再重复使用将会比多次执行查询快得多.

游标使用五部曲:
1. Create the cursor.
2. Open the cursor for use within the procedure or application.
3. Fetch a record's data one row at a time until you have reached the end of

the cursor's records.
4. Close the cursor when you are finished with it.
5. Deallocate the cursor to completely discard it.


(1)创建游标
     如果使用Transcat-SQL来创建游标,一个游标有两个重要的部分:游标结果集和游标的位置,在声明游标时你必须同时定义将要在你的所有的游标操作中使用的结果集.
其语法如下:
     declare cursor_name cursor
     for select_statement

(2)打开游标,使用前必须先打开哟:这样才会执行select_statement,并将结果集载入到数据缓冲区。
     open cursor_name

(3)使用游标来进行翻阅(喜欢叫做遍历)
     后面重点详述,暂且不表。

(4)关闭游标
     这时游标依然存在,但是它必须被再次打开方可使用.关闭一个游标从本质上来说是关闭了它的结果集释放了数据缓冲区。
     close cursor_name

(5)释放游标
     如果你已经完全结束了对一个游标的使用的话.DEALLOCATE 命令将释放让游标所占用的内存并且可以让游标的名字可以再次被用作声明之用.当不使用游标的时候,一定要记得关闭游标并将它释放掉.
 deallocate cursor cursor_name


    遍历游标结果集使用fetch语句,语法如下:
     fetch [[fetch—orientation] from] cursor_name [host—variables]
     fetch—orientation表示游标的取数方向。有如下几种方式(详细用法我就不再唧唧歪歪了):
         [next|prior|first|last|absolute n|relative n]
     host—variables表示用于存放一条记录中各列的局部变量。用法例如:
          fetch Artists_Cursor into @name, @homebase, @style, @artist_id

    每一句fetch只会取得一条结果集,我们需要用到每一条记录就需要使用循环。 使用while循环逐行遍历记录集,我们需要知道记录集行数,也就是知道如何结束循环。遍历游标结果集时我们常用到几个全局变量,因为全局能被其他同类型语句改变,所以当流程控制复杂时使用它们要注意。
     @@CURSOR_ROWS连接上打开的上一个游标中的当前限定行的数目。为0时表示没有已打开的游标。为n时则是游标中的总行数。负值则是异步游标。
     @@ROWCOUNT为受上一SQL语句影响的行数,在游标使用中,我们打开游标后即可从此变量中获取结果集的行数,DECLARE CURSOR和FETCH将@@ROWCOUNT值设置为1,DEALLOCATE CURSOR、CLOSE CURSOR等语句将ROWCOUNT值重置为0。
     @@fetch_status返回最后一次运行FETCH 语句的状态信息。
返回值说明:
0 FETCH 语句成功。
-1 FETCH 语句失败或行不在结果集中。
-2 提取的行不存在。

举个例子窥其一斑 for eg.
DECLARE Employee_Cursor CURSOR FOR
SELECT EmployeeID, Title FROM Employee
OPEN Employee_Cursor
FETCH NEXT FROM Employee_Cursor  --fetch的方向默认为next,所以FETCH FROM Employee_Cursor等效
WHILE @@FETCH_STATUS = 0  --条件判断
   BEGIN
      FETCH NEXT FROM Employee_Cursor
   END
CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor


各位看官或许要问fetch来一条记录,啥都没干就close了,为了操作记录我们还需在fetch一条记录后使用delete或update。用法与普通的删除修改相似,区别只在where子句
fetch cursor_name
delete table_name
where current of cursor_name

current of cursor_name代表游标指向的当前,并且影射到基表中的对应行。

最后举个全例:
1> declare @name char(30)
2> declare @homebase char(40)
3> declare @style char(20)
4> declare @artist_id int
5> create Artists_Cursor cursor
6> for select * from ARTISTS
7> open Artists_Cursor
8> fetch Artists_Cursor into @name, @h
9> while (@@sqlstatus = 0)
10> begin
11>      print @name
12>      print @homebase
13>      print @style
14>      print char(@artist_id)
15>      fetch Artists_Cursor into @na
16> end
17> close Artists_Cursor
18> deallocate cursor Artists_Cursor
19> go