SQL 游标

关系数据库中的操作会对整个行集起作用。 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行。 这种由语句返回的完整行集称为结果集。 应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。 这些应用程序需要一种机制以便每次处理一行或一部分行。 游标就是提供这种机制的对结果集的一种扩展。

游标通过以下方式来扩展结果处理:

  • 允许定位在结果集的特定行。

  • 从结果集的当前位置检索一行或一部分行。

  • 支持对结果集中当前位置的行进行数据修改。

  • 为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。

  • 为脚本、存储过程和触发器中的 Transact-SQL 语句提供访问结果集中数据的权限。

注解

在某些情况下,如果表上有一个主键,可以使用 WHILE 循环代替游标,而不会产生游标的开销。

然而,在某些情况下,游标不仅是不可避免的,而且实际上是不可或缺的。 在这种情况下,如果不需要基于游标来更新表,则使用 firehose 游标,即快进和只读游标。

游标实现

SQL Server 支持三种游标实现。

游标实现说明
Transact-SQL 游标Transact-SQL 游标基于 DECLARE CURSOR 语法,主要用于 Transact-SQL 脚本、存储过程和触发器。 Transact-SQL 游标在服务器上实现,并由从客户端发送到服务器的 Transact-SQL 语句管理。 它们还可能包含在批处理、存储过程或触发器中。
应用程序编程接口 (API) 服务器游标API 游标支持 OLE DB 和 ODBC 中的 API 游标函数。 API 服务器游标在服务器上实现。 每次客户端应用程序调用 API 游标函数时,SQL Server Native Client OLE DB 提供程序或 ODBC 驱动程序会把请求传输到服务器,以便对 API 服务器游标进行操作。
客户端游标客户端游标由 SQL Server Native Client ODBC 驱动程序和实现 ADO API 的 DLL 在内部实现。 客户端游标通过在客户端高速缓存所有结果集行来实现。 每次客户端应用程序调用 API 游标函数时,SQL Server Native Client ODBC 驱动程序或 ADO DLL 会对客户端上高速缓存的结果集行执行游标操作。

游标类型

SQL Server 支持四种游标类型。

游标可以使用 tempdb 工作表。 就像溢出的聚合或排序操作一样,它们会产生 I/O 成本,是潜在的性能瓶颈。 STATIC 游标从一开始就使用工作表。 有关详细信息,请参阅查询处理体系结构指南中的工作表部分。

只进

只进游标指定为 FORWARD_ONLY 和 READ_ONLY,不支持滚动。 这些游标也称为“firehose”游标,并且只支持从游标的开始到结束连续提取行。 行只在从数据库中提取出来后才能检索。 对所有由当前用户发出或由其他用户提交、并影响结果集中的行的 INSERTUPDATE 和 DELETE 语句,其效果在这些行从游标中提取时是可见的。

由于游标无法向后滚动,但在提取行后对数据库中的行进行的大多数更改通过游标均不可见。 当值用于确定所修改的结果集(例如更新聚集索引涵盖的列)中行的位置时,修改后的值通过游标可见。

尽管数据库 API 游标模型将只进游标视为一种游标类型,但是 SQL Server 不这样。 SQL Server 将只进和滚动视为可应用于静态游标、键集驱动游标和动态游标的选项。 Transact-SQL 游标支持只进静态游标、键集驱动游标和动态游标。 数据库 API 游标模型则假定静态游标、键集驱动游标和动态游标都是可滚动的。 当数据库 API 游标属性设置为只进时,SQL Server 将此游标作为只进动态游标实现。

静态

静态游标的完整结果集是打开游标时在 tempdb 中生成的。 静态游标总是按照打开游标时的原样显示结果集。 静态游标在滚动期间很少或根本检测不到变化,但消耗的资源相对很少。

游标不反映在数据库中所做的任何影响结果集成员身份的更改,也不反映对组成结果集的行的列值所做的更改。 静态游标不会显示打开游标以后在数据库中新插入的行,即使这些行符合游标 SELECT 语句的搜索条件。 如果组成结果集的行被其他用户更新,则新的数据值不会显示在静态游标中。 静态游标会显示打开游标以后从数据库中删除的行。 静态游标中不反映 UPDATEINSERT 或者 DELETE 操作(除非关闭游标然后重新打开),甚至不反映使用打开游标的同一连接所做的修改。

注意

SQL Server 静态游标始终是只读的。

由于静态游标的结果集存储在 tempdb 中的一个工作表中,因此结果集中的行大小不能超过 SQL Server 表的最大行大小。

有关详细信息,请参阅查询处理体系结构指南中的工作表部分。 有关最大行大小的详细信息,请参阅 SQL Server 最大容量规范。

Transact-SQL 称静态游标为不敏感游标。 一些数据库 API 将这类游标识别为快照游标。

Keyset

打开由键集驱动的游标时,该游标中各行的成员身份和顺序是固定的。 由键集驱动的游标由一组唯一标识符(键)控制,这组键称为键集。 键是根据以唯一方式标识结果集中各行的一组列生成的。 键集是打开游标时来自符合 SELECT 语句要求的所有行中的一组键值。 由键集驱动的游标对应的键集是打开该游标时在 tempdb 中生成的。

动态

动态游标与静态游标相对。 当滚动游标时,动态游标反映结果集中所做的所有更改。 结果集中的行数据值、顺序和成员在每次提取时都会改变。 所有用户做的全部 UPDATEINSERT 和 DELETE 语句均通过游标可见。 如果使用 API 函数(如 SQLSetPos)或 Transact-SQL WHERE CURRENT OF 子句,通过游标进行更新,这些更新将立即可见。 在游标外部所做的更新直到提交时才可见,除非将游标的事务隔离级别设为未提交读取。 有关隔离级别的详细信息,请参阅 SET TRANSACTION ISOLATION LEVEL (Transact-SQL)。

注意

动态游标计划从不使用空间索引。

请求游标

SQL Server 支持两种游标请求方法:

  • Transact-SQL

    Transact-SQL 语言支持根据 ISO 游标语法建模的游标使用语法。

  • 数据库应用程序编程接口(API)游标函数

    SQL Server 支持以下数据库 API 的游标功能:

    • ADO(Microsoft ActiveX 数据对象)

    • OLE DB

    • ODBC(开放式数据库连接)

应用程序不能混合使用这两种请求游标的方法。 如果应用程序已经使用 API 指定游标行为,则不应再执行 Transact-SQL DECLARE CURSOR CURSOR 语句来请求 Transact-SQL 游标。 应用程序只有在将所有的 API 游标特性设置回默认值后,才应执行 DECLARE CURSOR

如果既未请求 Transact-SQL 游标,也未请求 API 游标,则默认情况下 SQL Server 将向应用程序返回一个完整的结果集,这个结果集称为默认结果集。

游标进程

Transact-SQL 游标和 API 游标有不同的语法,但下列通用过程适用于所有 SQL Server 游标:

  1. 将游标与 Transact-SQL 语句的结果集相关联,并且定义该游标的特性,例如是否能够更新游标中的行。

  2. 执行 Transact-SQL 语句以填充游标。

  3. 从游标中检索您想要查看的行。 从游标中检索一行或一部分行的操作称为提取。 执行一系列提取操作以便向前或向后检索行的操作称为滚动。

  4. 根据需要,对游标中当前位置的行执行修改操作(更新或删除)。

  5. 关闭游标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装Go语言常用工具

好的,这里是常用的Go工具,包括下载地址、在线安装指令和离线安装步骤。 1. gopls (Go language server) 功能: 提供代码补全、跳转定义、文档提示等IDE功能。 下载地址: golang.org/x/tools/gopls 在线安装命令 : sh 复制代码 go install golang.org/…

云仓适合什么商家?

1、电商平台和网店: 对于拥有大量在线订单但没有自建仓储和物流能力的小型和中型电商企业,云仓可以在成本和效率上提供显著优势,帮助快速处理订单并缩短配送时间。 —————————————————————————————————— …

根据关键词query获取google_img(api方式)

文章目录 说明代码第一部分:链接保存为Json第二部分:链接转换为img 说明 根据关键词query获取google_img USERNAME “xxx” PASSWORD “xxx” 官网申请。 代码 首先获取图片链接,保存为json之后下载。 第一部分:链接保存为…

.net 8 使用 quic 协议通讯

debian环境安装 quic支持 # 1. 添加unstable仓库(如果您使用的是Debian的不稳定分支) sudo apt install apt-transport-https ca-certificates sudo wget -O /etc/apt/trusted.gpg.d/microsoft.gpg https://packages.microsoft.com/keys/microsoft.asc …

【独家揭秘】视频号矩阵系统火爆上线,一键式多平台管理,你的内容营销神器!

在信息爆炸的时代,内容创作者们面临着前所未有的挑战与机遇。如何让自己的内容在众多平台中脱颖而出,快速传播并吸引大量观众,成为了每个创作者关注的焦点。近日,一款名为“迅狐视频号矩阵系统”的神器震撼来袭,它以其…

UV胶,它是否有毒?如同那些隐藏在黑暗中的危险之物?

UV胶,它是否有毒?如同那些隐藏在黑暗中的危险之物? 关于uv胶的毒性问题,或许我们可以这样深入探讨。UV胶,如同一位戴着神秘面纱的访客,在我们的生活中悄然出现,却带着诸多疑问。那么&#xff0…

二维码生成需知:名片二维码尺寸多少合适?电子名片二维码制作方法?

随着数字化时代的到来,二维码在各个领域的应用越来越广泛,名片作为商业交流的重要工具之一,也开始逐渐融入二维码的元素。通过在名片上添加二维码,我们可以轻松实现信息的快速传递和分享。然而,名片二维码的尺寸选择成…

Monorepo仓库管理策略之 Lerna

这里写目录标题 前言:一、简介二、新建项目使用安装生成结构 三、复用现有项目执行命令查看包 四、配置package相互引用导入现有的包 五、发布包确定项目版本发布项目添加项目到到git发布包到NPM包发布出错解决方案 五、实例代码 前言: 将大型代码仓库分…

Python 与扣子 API的链接

当 Python 与各种 API 进行链接时,更是能碰撞出无数精彩的火花,为我们的开发工作带来极大的便利和创新。今天,咱们就来聊聊 Python 与扣子 API 的链接那些事儿。 扣子 API 作为一种新兴的技术接口,为我们提供了丰富的数据和功能。…

文心一言的流式接口数据进行处理 增加属性

需求:需要对文心一言的流式接口数据进行处理 增加属性 return ResponseEntity.ok().header("Access-Control-Allow-Origin", "*").contentType(org.springframework.http.MediaType.TEXT_EVENT_STREAM).cacheControl(org.springframework.http…

python调用串口收发数据

1、确认串口信息 2、安装pyserial库 打开终端或命令行,敲入这行命令:pip install pyserial 3、python编程 import serial def main(): #创建串口对象 ser serial.Serial(COM4, 9600, timeout1) if not ser.isOpen(): print("串…

飞睿智能6公里WiFi图传接收模块,低延迟、抗干扰、高速稳定传输数据,无人机、农田远距离WiFi模块

在科技日新月异的今天,无线通信技术正以前所未有的速度发展,不仅改变了我们的生活方式,还为企业带来了前所未有的商业机遇。今天,我要向大家介绍一款飞睿智能的产品——6公里WiFi图传接收模块,它以其高性能、稳定的传输…

【常见的设计模式】单例模式

参考:【设计模式专题之单例模式】1.小明的购物车 【设计模式专题之单例模式】 1.小明的购物车 时间限制:1.000S 空间限制:256MB   题目描述 小明去了一家大型商场,拿到了一个购物车,并开始购物。请你设计一个购物车管…

【React】基础数据回填--useForm与setFieldsValue详解

相关属性 1.form 2.setFieldsValue 代码 import{Form }from"antd";const Publish =

体积大的快递怎么寄便宜?如何寄件寄包裹更省钱?

大学毕业了,面对即将到来的工作生活,小李不得不把宿舍里的大包小包打包寄回家。可是,当他真正开始打包行李时,才发现这可不是一件简单的事:衣服、被子、书籍、杂物……这些东西加起来体积不小,想要省钱寄快…

虚拟化技术 DeskV(或Desktop Virtualization)

DeskV(或Desktop Virtualization),即桌面虚拟化技术,是一种将计算机的桌面系统(包括操作系统、应用程序和用户数据)进行虚拟化,以实现桌面使用的安全性和灵活性的技术。以下是关于DeskV&#xf…

基于stm32单片机的智能手环的设计

摘 要 随着科技的飞速发展和人们生活水平的提高,健康与科技日益融合,智能可穿戴设备已成为现代人生活中不可或缺的一部分。智能手环,作为一种便携、实用且功能丰富的可穿戴设备,受到越来越多用户的喜爱。它不仅能够实时监测用户的…

简化嵌入式Linux开发:在Ubuntu上安装和配置交叉编译环境的高效方法

在嵌入式Linux开发中,我们通常需要在Ubuntu上安装交叉编译工具链,并配置相关文件。编译过程中,如果遇到依赖库问题,还需要手动查找并编译开源源码。这些步骤较为繁琐,为了简化操作,我们可以尝试以下方案&am…

深度解析:银行小额支付与大额支付的关键区别与应用场景

一、交易金额 小额支付:通常适用于金额在5万元以下的支付场景。这种支付方式更适合个人用户或小额交易场景,如便利店购物、支付停车费、小额汇款等。大额支付:涉及金额较大的支付交易,一般被定义为单笔交易金额超过一定数额&…

特殊的“user profile service服务登录失”情况

记录一下比较特殊的user profile service服务登录失败情况 公司电脑,某次之后每次来公司电脑开机后就会出现这个情况,后来发现只要是关机后再开机百分百出现,重启就不会,一开始也百度、google了,网上有很多解决方式&am…