-
简介
msdn原文。-
在C#中,当我们需要遍历一个数据集时,可以使用 foreach(){ }。这个时候,我们的操作对象是单一数据,而不是整个结果集。当我们想在后台数据库中直接面向单一数据进行操作时(比如,对一个查询结果集中的每一条记录进行不同的操作),我们需要用到Cursor。它能够将一个结果集转换为一个可遍历的集合(sql 默认情况下是面向数据集的,而不是单一记录,我们只能对整个数据集操作)。我们把cursor叫做服务端游标。
-
cursor的声明语法分为两类:1 基于Iso 标准 2 基于Transact-SQL . 这里我只介绍Transact-SQL.
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ] [;] -
学习Cursor的参数
- cursor_name:
cursor的名称,需要注意的是必须遵循标识规范 -
LOCAL:
限定cursor的作用域:只在声明它所在的batch、stored procedure、trigger中有效。当batch、stored procedure、trigger结束时,其作用域内的cursor会被隐式释放掉。但是,如果我们使用OUTPUT,将局部cursor传递给外部的变量,那么即使batch、stored procedure、trigger已经结束,该cursor依然存在。这个时候,当引用cursor的变量被释放掉或者超出该引用变量的作用域时,cursor会被隐式释放掉。也就是说,通过OUTPUT我们可以扩大cursor的作用域。 -
GLOBAL:
指定cursor的作用域为全局。任何stored procedure、batch都可以引用该cursor。只有断开连接,该cursor才会被释放。
默认值可通过数据库属性 -> option ->cursor 指定。 -
FORWARD_ONLY:
1. 指定游标只能从第一行滚动到最后一行。这种情况下只有Fetch Next 提取项可用。
2. 当没有指定STATIC、KEYSET 和 DYNAMIC时,默认为Forward_Only,否则为Scroll
3. 当指定了Forward_Only时,默认为 DYNAMIC。 -
SCROLL:
指定是否所有的提取操作(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)都可用。scrll跟fast_forward冲突,不可同用。 -
STATIC:
- 会在tempdb中创建副本。
- 所有的提取操作都来自于临时表而不是基表。
- 不允许对cursor进行更改.(Where Current Of)
-
KEYSET:
- 打开游标时,行的身份和顺序会被固定,对行进行唯一标识的键集保存在tempdb中的keyset
- 对基表非键值所做的更改会被映射到cursor中如果基表没有唯一键,那么cursor是STATIC的,而不是keyset
- 对基表的插入操作不会映射到cursor
- 对基表的删除操作会更新临时表的键集中对应的值为null。(并没有删除,只是为null)
- 对基表的键值更新操作,等同于删除添加操作。cursor中的对应位置为null
- 通过Where Current Of修改,不管是否是唯一键,都可以映射
-
DYNAMIC:
不管是值、顺序还是成员关系, 对行所做的所有更改都会反应到游标中。
不支持ABSOLUTE -
FAST_FORWARD:
指定对FORWARD_ONLY,READ_ONLY进行性能优化
不能跟SCROLL或者FOR_UPDATE同时使用 -
READ_ONLY:
禁用游标的更新功能。(我的测试表明read_only无效) -
SCROLL_LOCKS:
通过锁保证游标的更新删除操作一定成功。不能跟FAST_FORWARD、STATIC同用 -
OPTIMISTIC:
不使用所,当对应的基表存在更新时,通过cursor的update、delete会失败。不能跟FAST_FORWARD同用 -
TYPE_WARNING:
指定如果游标从所请求的类型隐式转换为另一种类型,则向客户端发送警告消息。 -
select_statement:
查询语句。不能使用关键字 COMPUTE, COMPUTE BY, FOR BROWSE, and INTO.
您可以在游标声明中使用查询提示;但如果还使用 FOR UPDATE OF 子句,请在 FOR UPDATE OF 之后指定 OPTION (query_hint)。
如果 select_statement 中的子句与所请求的游标类型的功能有冲突,则 SQL Server 会将游标隐式转换为其他类型。 -
FOR UPDATE [OF column_name [,...n]]
定义游标中可更新的列。 如果提供了 OF column_name [,...n],则只允许修改所列出的列。
如果指定了 UPDATE,但未指定列的列表,则除非指定了 READ_ONLY 并发选项,否则可以更新所有的列。
- cursor_name:
-
-
注意
DECLARE CURSOR 定义 Transact-SQL 服务器游标的属性,例如游标的滚动行为和用于生成游标所操作的结果集的查询。 OPEN 语句填充结果集,FETCH 从结果集返回行。 CLOSE 语句释放与游标关联的当前结果集。 DEALLOCATE 语句释放游标所使用的资源。
浙公网安备 33010602011771号