游标

不带ORDER BY 子句的查询返回的是一个集合(或多集),而带有ORDER BY 子句的查询返回的是一种ANSI 称为游标(cursor)的对象,因为这种结果的行之间具有固定的顺序,所以不是关系的结果。

在默认情况下应该使用基于集合的查询,只在有令人信服的理由时才考虑使用游标。

因为

1.如果使用游标,就严重违背了关系模型,关系模型要求按照集合来考虑问题。

2.游标逐行对记录进行操作会带来一定的开销。和基于集合的操作相比,游标分别对每一记录进行操作,这肯定会带来一定的额外开销。给定一个基于集合的查询,以及一段在幕后用游标完成类似物理处理的代码,游标代码通常比基于集合的代码要慢许多倍。

3.使用游标,需要为解决方案的物理操作编写很多代码,换句话说,得写很多代码来描述如何处理数据(声明游标、打开游标、循环遍历游标记录、关闭游标、释放游标)。而使用基于集合的解决方案,则主要关注于问题的逻辑方面,也就是说,只要描述要获取什么,而不必描述如何获取它们。因此,与基于集合的解决方案相比,基于游标的解决方案通常代码更长,可读性更低,也更加难以维护。

使用游标通常涉及以下步骤:

1. 在某个查询的基础上声明游标。

2. 打开游标。

3. 从第 1 个游标记录中把列值提取到指定的变量。

4. 当还没有超出游标的最后一行时(@@FETCH_STATUS 函数的返回值是0),循环遍历游标记录;在每一次遍历中,从当前游标记录中把列值提取到指定的变量,再为当前行执行相应的处理。

5. 关闭游标。

6. 释放游标。

DECLARE @ID int
DECLARE @Name nvarchar(max)
DECLARE C CURSOR   
 FOR SELECT categoryId,categoryname FROM dbo.Categories   -- 定义游标
OPEN C      -- 打开游标
FETCH NEXT FROM C INTO @ID,@Name  -- 移向第一个游标
--SELECT @ID+@Name
WHILE @@FETCH_STATUS=0
BEGIN
 SELECT str(@ID)+@Name
 FETCH NEXT FROM C INTO @ID,@Name  --移向下一条数据
END
CLOSE C;                 -- 关闭游标
DEALLOCATE C              -- 释放游标

posted @ 2014-06-18 23:52  守护之翼  阅读(149)  评论(0编辑  收藏  举报