MSSQL游标的原理及示例
从而把对集合的操作转化为对单个纪录的处理。游标使用的步骤如下:
declare <游标名> cursor for <select语句>;
open <游标名>;
fetch语句通常用在一个循环结构体中,通过循环执行fetch语句逐条取出结果集中的行进行处理。现在好多数据库中,还允许任意方向任意步长易懂游标指针,
而不仅仅是把游标指针向前推进一行了。
fetch <游标名> into <变量1>,<变量2>...
与新的查询结果相联系。
close <游标名>;
游标使用不再需要之后,要释放游标。DEALLOCATE语句释放数据结构和游标所加的锁。
语法如下:DEALLOCATE [GLOBAL] cursor_name | cursor_variable_name
游标的基本使用模板
declare declare 游标名[scroll] cursor for select语句[for update [of列表名]]
定义一个游标,使之对应一个select语句
for update任选项,表示该游标可用于对当前行的修改与删除
open
打开一个游标,执行游标对应的查询,结果集合为该游标的活动集
open 游标名
fetch
在活动集中将游标移到特定的行,并取出该行数据放到相应的变量中
fetch [next | prior | first | last | current | relative n | absolute m] 游标名into [变量表]
close
关闭游标,释放活动集及其所占资源。需要再使用该游标时,执行open语句
close 游标名
deallocate
删除游标,以后不能再对该游标执行open语句
deallocate 游标名
@@FETCH_STATUS返回被FETCH 语句执行的最后游标的状态.
0 fetch语句成功
-1 fetch语句失败
-2 被提取的行不存在
SELECT EmployeeID, Title
FROM AdventureWorks.HumanResources.Employee
OPEN Employee_Cursor
FETCH NEXT FROM Employee_Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
--//TO DO...
FETCH NEXT FROM Employee_Cursor
END
CLOSE Employee_Cursor
DEALLOCATE Employee_Cursor
GO
游标性能问题
最好的改进游标性能的技术就是:能避免时就避免使用游标,尽可能用对应的语句完成相同的功能(一般情况下,考虑得当效率能大大提升)。
SQL Server是关系数据库,其处理数据集比处理单行好得多,单独行的访问根本不适合关系DBMS。若有时无法避免使用游标,
则可以用如下技巧来优化游标的性能。
(1). 除非必要否则不要使用static/insensitive游标。打开static游标会造成所有的行都被拷贝到临时表。这正是为什么它对变化不敏感的原因
——它实际上是指向临时数据库表中的一个备份。
很自然,结果集越大,声明其上的static游标就会引起越多的临时数据库的资源争夺问题。
(2). 除非必要否则不要使用keyset游标。和static游标一样,打开keyset游标会创建临时表。虽然这个表只包括基本表的一个关键字列(除非不存在唯一关键字),
但是当处理大结果集时还是会相当大的。
(3). 当处理单向的只读结果集时,使用fast_forward代替forward_only。使用fast_forward定义一个forward_only,则read_only游标具有一定的内部性能优化。
(4). 使用read_only关键字定义只读游标。这样可以防止意外的修改,并且让服务器了解游标移动时不会修改行。
(5). 小心事务处理中通过游标进行的大量行修改。根据事务隔离级别,这些行在事务完成或回滚前会保持锁定,这可能造成服务器上的资源争夺。
(6). 小心动态光标的修改,尤其是建在非唯一聚集索引键的表上的游标,因为他们会造成“Halloween”问题——对同一行或同一行的重复的错误的修改。
因为SQL Server在内部会把某行的关键字修改成一个已经存在的值,并强迫服务器追加下标,使它以后可以再结果集中移动。当从结果集的剩余项中存取时,
又会遇到那一行,然后程序会重复,结果造成死循环。
(7). 对于大结果集要考虑使用异步游标,尽可能地把控制权交给调用者。当返回相当大的结果集到可移动
转载于:https://www.cnblogs.com/zhxhdean/archive/2011/06/13/2080012.html
MSSQL游标的原理及示例相关推荐
- CPU Cache原理与示例
CPU Cache原理与示例 基础知识 现在的 CPU 多核技术,都会有几级缓存,老的 CPU 会有两级内存(L1 和 L2),新的CPU会有三级内存(L1,L2,L3 ),如下图所示: 其中: ...
- Swift与LLVM-Clang原理与示例
Swift与LLVM-Clang原理与示例 LLVM 学习 从 简单汇编基础 到 Swift 不简单的 a + 1 作为iOS开发,程序崩溃犹如家常便饭,秉着没有崩溃也要制造崩溃的原则 每天都吃的很饱 ...
- Oracle 并行原理与示例总结
<Oracle 并行原理与示例总结> 并行:把一个工作分成几份,分给不同进程同时进行处理. 进程层面 并发:多个会话同时进行访问,就是通常所说并发数.会话层面 数据库版本 LEO1@LEO ...
- 《Arduino开发实战指南:机器人卷》一3.6 编程原理与示例程序
本节书摘来华章计算机<Arduino开发实战指南:机器人卷>一书中的第3章 ,第3.6节,黄文恺 伍冯洁 陈 虹 编著更多章节内容可以访问云栖社区"华章计算机"公众号查 ...
- mysql的游标处理_MySQL存储过程 游标 错误处理的示例代码
MySQL存储过程 游标 错误处理的示例代码--set_account_data 重新生成用户编号 BEGIN DECLARE temp_id INT(8); /*用户id*/ DECLARE tem ...
- TensorFlow XLA优化原理与示例
TensorFlow XLA优化原理与示例 XLA概述 XLA(加速线性代数)是用于优化TensorFlow计算的线性代数的域特定编译器.结果是在服务器和移动平台上的速度,内存使用率和可移植性得到了改 ...
- 逆向工程核心原理图书-示例样本(无病毒)
逆向工程核心原理图书-示例样本(无病毒) https://github.com/snappyJack/reverse-core
- 简述游标原理 mysql_mysql游标的原理与用法实例分析
本文实例讲述了mysql游标的原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是游标 创建游标 使用游标 首发日期:2018-04-18 什么是游标: 如果你前面看过mysql函数,会发 ...
- 计算机体系结构 第1-2章 量化设计与分析基础/指令系统原理与示例
第1章 量化设计与分析基础 计算机的分类类别 计算机系统结构定义和计算机的设计任务:指令集结构概念及要素 实现技术的趋势:技术发展的趋势 集成电路功耗的趋势:功耗的概念 可靠性:提高可靠性的方法 6. ...
最新文章
- tensorboard图上存在直线_高中数学必修二直线与圆:真是让我没想到,他俩的关系还挺不简单...
- Nginx支持CGI
- linux 命令行简介
- OnClientClick和OnClick同时使用!
- linux系统修改时区开发板,Linux系统时区时间修改
- Javascript预解析、作用域、作用域链
- python怎么爬取知乎回答并制作词云_用Python分析了国庆“坑爹”景点......
- 雷林鹏分享:Lua break 语句
- java 中的异步回调
- Educoder Basemap和seaborn 第三关:Basemap
- 类型的设计--方法:构造器、操作符、转换操作符和参数
- java 文件流 追加_JAVA向文件中追加内容(转)
- php 七牛视频鉴黄,API调用视频鉴黄v1(不推荐)
- 打印机服务器怎么配置文件,打印机服务器ftp配置文件
- 玩期货风险大吗(玩期货有风险吗)
- [Pandas] 缺失值删除 df.dropna()
- DasBlog: 构建一个分布式.NET 协作系统
- android布局优化!Android动态换肤实现原理解析,灵魂拷问
- Windows 10 Cortana搜索栏无效变白色解决方案
- 小本经营如何获得银行贷款?