SQL Server 数据库之游标

1. 游标的概述

游标是 SQL Server 数据库开辟的一个缓冲区;
在 SQL Server 数据库中,游标是指向一个查询结果集的一个指针,是通过定义语句和一条 SELECT 语句关联的 SQL 语句;
游标的实际上是从一种包括多条数据记录的结果集中每次提取一条记录的机制
游标中包含游标结果集游标位置两项内容,用户能使用游标查看结果集中向前或向后的查询结果,也能将游标定位在任意位置查看结果;
在 SQL Server 中,数据都是通过结果集的方式操作的,并没有描述表中单条记录的表达形式,只能通过 WHERE 子句来对查询结果进行限定,使用游标能弥补了这种操作上的空缺,使得数据在操作过程中更加灵活;

2. 游标的优点

使用 SELECT 语句查询数据时返回的是一个结果集,在程序设计中对数据结果集的处理不是特别的方便和有效;
游标提供了一种从结果集中每次读取一条记录的机制,让程序能够对返回的记录逐行进行处理;
游标必须与 SQL 选择语句关联才能使用,由返回的数据结果集和游标位置;
游标有以下几个优点:

  1. 使用游标能对 SELECT 返回数据集中的每一条数据做相同或不同的操作,而非对数据集中的所有数据做同一个操作;
  2. 使用游标能对基于游标位置的数据进行更新和删除;
  3. 游标能很好地将数据库与程序连接起来;

3. 游标的类型

游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定的记录的游标位置组成;
SQL server 数据库中支持以下3种类型的游标:

3.1. T-SQL 游标

使用 DECLARE CURSOR 语法创建的游标,主要作用于 T-SQL 脚本、存储过程和触发器中,它们使结果集的内容可用于其他 T-SQL 语句;
T-SQL 游标主要用在服务器上,由从客户端发送给服务器 T-SQL 语句或批处理、存储过程、触发器中的 T-SQL 进行管理;
T-SQL 游标不支持提取数据块或多行数据;

3.2. API 游标

API 游标能在 OLE DB、ODBC以及 DB_library 中使用游标函数,主要作用在服务器上;
当客户端程序通过 API 调用游标函数时,SQL Server 的 OLE DB 提供者、DB_library 的动态链接库会将操作请求传递到服务器对 API 游标进行处理;
API 服务器游标包含静态游标、动态游标、只进游标、键集驱动游标 4 种;

3.2.1. 静态游标

静态游标的结果集会将打开游标时建立的结果存储临时表中(静态游标为只读);
静态游标显示的结果集总是和打开游标时一样,静态游标不会对数据库中的修改做出反应,不会对结果集中的列值更改做出反应,也不会显示游标打开后在数据库总新插入记录;
若组成结果集的值被更改,新的数据值也不会再静态游标中显示;
静态游标会显示出打开游标后数据表中删除的记录;

3.2.2. 动态游标

动态游标的特性和静态游标相反,当滚动游标时会动态地反映出结果集中的所有更改内容;
结果集中的数据会随着用户的 INSERT、UPDATE、DELETE 操作而进行改变;

3.2.3. 只进游标

只进游标不能滚动,只能将数据集中的数据从头到位依次提取;由于只进游标无法回滚,当读取过的数据发生更改时游标无法反映,若更改的数据恰好发生在只进游标读取的当前记录行,就能反映出数据的变化;

3.2.4. 键集驱动游标

键集驱动游标同时具备静态游标动态游标的特点;
当打开游标时,游标中的记录行顺序时固定的,键集会随着游标的打开而存储在临时表中;
打开游标后,数据表中插入的新纪录时不可见的,除非重启游标;
对非键集列的数据更改在游标滚动时可见;

4. 客户端游标

客户端游标用于客户机上缓存结果集时使用;
ODBC 和 DB_library 都支持客户端游标;
在客户端游标中,默认结果集用于将整个结果集高速缓存中执行;
客户端游标只能是只进和静态游标,不支持键集驱动游标和动态游标;
T-SQL 游标和 API 游标都是运行在服务器中的,又称为服务器游标;
注意: T-SQL 游标主要用于存储过程、触发器和 T-SQL 脚本中,它们使结果集的内容可用于其他 T-SQL 语句;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server中,存储过程可以使用游标来处理数据。游标是一种用于遍历和操作结果集的数据库对象。SQL Server支持三种游标实现方式:基于DECLARE CURSOR语法、基于OLE DB和ODBC中的API游标函数以及基于API服务器游标。\[2\] 使用游标可以在存储过程中逐行处理结果集,对每一行进行特定的操作。例如,可以使用游标在结果集中循环遍历每一行,并根据特定条件进行数据操作。游标可以在存储过程中声明和使用,通过FETCH语句可以获取结果集中的每一行数据。 以下是一个使用游标的示例代码: ``` CREATE PROCEDURE ProcessData AS BEGIN DECLARE @Name VARCHAR(50) DECLARE @Age INT -- 声明游标 DECLARE CursorName CURSOR FOR SELECT Name, Age FROM YourTable -- 打开游标 OPEN CursorName -- 获取第一行数据 FETCH NEXT FROM CursorName INTO @Name, @Age -- 循环处理结果集 WHILE @@FETCH_STATUS = 0 BEGIN -- 在这里可以对每一行数据进行操作 -- 例如,可以根据条件更新数据或者进行其他逻辑处理 -- 获取下一行数据 FETCH NEXT FROM CursorName INTO @Name, @Age END -- 关闭游标 CLOSE CursorName DEALLOCATE CursorName END ``` 在上述示例中,我们声明了一个名为CursorName的游标,并使用FETCH语句获取每一行数据。然后,我们可以在循环中对每一行数据进行操作。最后,我们关闭并释放游标。请注意,在实际使用中,应根据具体需求进行适当的修改和优化。\[1\] #### 引用[.reference_title] - *1* *2* *3* [Sql Server 存储过程游标](https://blog.csdn.net/qq_29342297/article/details/109181443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值