Loading

SQL Server教程 - T-SQL-游标(CURSOR)

更新记录
转载请注明出处:
2022年8月2日 发布。
2022年7月2日 从笔记迁移到博客。

游标说明(CURSOR)

实际上,Cursor是SQL Server数据库开辟的一块缓冲区。游标是一种数据访问机制,游标的实质是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标类似指针,可以指向结果数据集的任何一行。游标主要用于存储过程、触发器、T-SQL脚本中,游标中包含游标结果集和游标位置两项内容。

使用游标解决的问题:使用类型指针的单行查询,而不是一次性查询完所有结果集,减少开销。
注意:当查询大量数据时,游标的效率本质上低于T-SQL查询。

游标的优点

SELECT返同的是一个结果集,但有的时应用程序并不总是对整结果集进行处理。游标提供了这样一种机制,它从多条数据集中每次只取一条,优点如下:
(1)允许程序对由SELECT 直询语句返回的行集中的每一行执行相同或不同的操作,而不是对整个集合执行同一个操作。
(2)提供对基于游标位置的数据表中的行进行删除和更新的能力。
(3)游标作为数据库管理系统和应用程序设计之间的桥梁,将两种处理方式连接起来。

游标实现方式

Transact-SQL游标

基于DECLARE CURSOR语法,基于服务器上T-SQL实现。由从客户端发送到服务器的Transact-SQL 语句管理。它们还可能包含在批处理、存储过程或触发器中。

应用程序编程接口(API)服务器游标

OLE DB或ODBC中的API游标函数,API服务器游标在服务器上实现。每次客户端应用程序调用API游标函数时,SQL Server Native Client OLE DB 访问接口或ODBC驱动程序会把请求传输到服务器,以便对API服务器游标进行操作。

客户端游标

由 SQL Server Native Client ODBC 驱动程序和实现ADO API的DLL在内部实现。客户端游标通过在客户端高速缓存所有结果集中的行来实现。每次客户端应用程序调用API游标函数时,SQLServer Native Client ODBC 驱动程序或ADO DLL会对客户端上高速缓存的结果集中的行执行游标操作。

API服务器游标分类

静态游标

静态游标始终是只读

结果集建立在tempdb数据库中,改动不反映到结果集

静态游标消耗资源较少

修改更新对静态游标不可见

动态游标

修改更新对动态游标可见

只进游标

只进游标不支持滚动,只支持从头到尾顺序提取

只有从数据库中提取出来后才可以进行检索

修改更新对只进游标可见

键集驱动游标

当打开游标时,游标中的记录行顺序是固定的

键集会随着游标的打开而存储在临时表

使用游标的过程

声明游标(这个过程没有实际检索出数据)
打开游标
读取游标
关闭游标
释放游标

声明游标

-- 标准SQL语法
DECLARE 游标名 [INSENSITIVE] CURSOR [LOCAL | GLOBAL]
[SCROLL | FORWARD_ONLY]
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR
    -- Slect语句
[FOR {READ ONLY | UPDATE OF column_name}];

-- LOCAL 游标作用域是局部的
-- GLOBAL 游标作用域是全局的
-- FORWARD_ONLY 游标只能从第一行到最后一行
-- STATIC 静态的,写入tempdb的临时副本,从该临时数据库读取

注意:INSENSITIVE表示在tempdb中创建临时副本,数据从tempdb获得
注意:SCROLL表示操作(FIRST\LAST\PRIOR\NEXT\RELATIVE\ABSOLUTE)都可用
FIRST:取第一行数据
LAST:取最后一行数据
PRIOR:取前一行数据
NEXT:取后一行数据
RELATIVE:按相对未知取数据
ABSOLUTE:按绝对未知取数据
注意:游标内的SQL语句不可以使用COMPUTE、COMPUTE BY、BROWSE和INTO
注意:READ ONLY表示只读,不可以更新
注意:UPDATE OF表示可以更新的列,不设置则表示可以更新所有列
注意:LOCAL表示只在作用域内(批处理、存储过程、触发器)有效,游标结束后自动释放
注意:GLOBAL表示作用域时全局的
注意:FORWARD_ONLY表示只能向前(从第一行到最后一行)滚动
注意:STATIC表示创建结果集副本到tempdb

打开游标

OPEN [GLOBAL] 游标名;

读取游标

FETCH [NEXT | PRIOR | FIRST | LAST | ABSOLUTE N | RELATIVE N];
FROM [GLOBAL] 游标名
[INTO 变量名,...];

注意:NEXT表示当前行的后一行数据,NEXT是默认选项
注意:PRIOR表示返回当前行的前一行数据
注意:FIRST表示返回第一行并将其作为当前行
注意:LAST表示返回最后一行并将其作为当前行
注意:ABSOLUTE n,如果n是正数则从游标头开始的第n行,并将其作为当前行。如果n是负数则返回游标尾的前n行,并将其作为当前行,n为0无返回
注意:RELATIVE n,如果n是正数,则返回当前行之后的n行,并将其作为当前行。如果n是负数,则返回当前行之前的n行,并将其作为当前行。如果n为0,返回当前行
注意:INTO 变量名按查询的行中的列从左到右顺序进行赋值

关闭游标

CLOSE [GLOBAL] 游标名;

释放游标

DEALLOCATE [GLOBAL] 游标名;

实例

实例:读取游标的数据

image

实例:使用变量引用游标

image

实例:使用游标为变量赋值

image

实例:使用Order为游标内地数据排序

image

实例:使用游标修改数据

image

实例:使用游标删除数据

image

posted @ 2022-08-02 08:40  重庆熊猫  阅读(839)  评论(0编辑  收藏  举报