1. 游标简介

  游标是一种处理数据的方法,主要用于存储过程、触发器和Transact-SQL脚本中。SELECT语句返回的是一个结果集,游标能够从包含多条数据记录的结果集中每次提取一条记录。

  游标的特点:

  ◊ 允许对由SELECT查询语句返回的行集中的每一行执行相同或者不同的操作,而不是对整个集合执行同一个操作。

  ◊ 提供对基于游标位置的表中的行进行删除和更新。

2. 游标的基本操作

2.1 声明游标

  声明游标语法:

ISO Syntax
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
[;]
Transact-SQL Extended Syntax
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 ] ] ]
[;]

2.2 打开游标

  在使用游标之前,必须打开游标。

  打开游标的语法格式:

OPEN { { [ GLOBAL ] cursor_name } | cursor_variable_name }

2.3 读取游标中的数据

  打开游标之后,可以读取游标中的数据。FETCH用来读取游标中的某一行数据。

  FETCH语句的语法格式:

FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]

2.4 关闭游标

  在不使用游标的时候,可以将其关闭,以释放游标所占用的服务器资源。

  关闭游标CLOSE语法格式:

CLOSE { { [ GLOBAL ] cursor_name } | cursor_variable_name }

2.5 释放游标

  游标操作的结果集空间虽然被释放了,但是游标结构本身也会占用一定的资源,所以在使用完游标之后,为了收回被游标占用的资源,应该讲游标释放。

  释放游标DEALLOCATE语法格式:

DEALLOCATE { { [ GLOBAL ] cursor_name } | @cursor_variable_name }

3. 游标应用

3.1 使用游标变量

DECLARE @CUR_Product CURSOR                        -- 声明游标变量

DECLARE CUR_Product CURSOR FOR                     -- 创建游标
SELECT [ProductID],[ProductName] FROM [dbo].[Product] OPEN CUR_Product -- 打开游标
SET @CUR_Product = CUR_Product -- 为游标变量赋值 FETCH NEXT FROM @CUR_Product -- 从游标变量中读取值
WHILE @@FETCH_STATUS = 0 -- 判断FETCH语句是否获取到记录
BEGIN
FETCH NEXT FROM @CUR_Product -- 读取游标变量中的数据
END
CLOSE @CUR_Product -- 关闭游标
DEALLOCATE @CUR_Product -- 释放游标

3.2 使用游标为变量赋值

DECLARE @ProductID INT

DECLARE CUR_Product CURSOR FAST_FORWARD READ_ONLY FOR
SELECT [ProductID] FROM [dbo].[Product]
ORDER BY [ProductID] DESC OPEN CUR_Product
FETCH NEXT FROM CUR_Product INTO @ProductID
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @ProductID
FETCH NEXT FROM CUR_Product INTO @ProductID
END
CLOSE CUR_Product
DEALLOCATE CUR_Product
DECLARE @ProductID INT
DECLARE @ProductName VARCHAR(50) DECLARE CUR_Product CURSOR FAST_FORWARD READ_ONLY FOR
SELECT [ProductID],[ProductName] FROM [dbo].[Product] OPEN CUR_Product
FETCH NEXT FROM CUR_Product INTO @ProductID,@ProductName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT CONVERT(VARCHAR, @ProductID) + ' ' + @ProductName
FETCH NEXT FROM CUR_Product INTO @ProductID,@ProductName
END
CLOSE CUR_Product
DEALLOCATE CUR_Product

Sql Server系列:游标的更多相关文章

  1. SQL Server 系列文章快速导航(SWF版)

    一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...

  2. SQL Server系列文章目录

    SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录SQL Server系列文章目录

  3. SQL Server系列目录

    一.SQL Server基础部分 1  数据库概念及规范化设计 1.1 数据库物理模式设计 1.2 Microsoft SQL Server Management Studio模板资源管理器 2 数据 ...

  4. Sql Server系列:子查询

    1 子查询概念 子查询是嵌套在另一个查询中的普通T-SQL查询.在有一个SELECT语句通过使用小括号创建子查询,作为另一个查询的部分数据或条件的基础. 子查询通常用于满足以下某个需求: ◊ 将一个查 ...

  5. SQL Server系列

    这里整理了我学习SQL Server的全部文章,包括从基础到高级,做一个目录,方便以后查找. SQL Server数据类型 SQL Server中开发常用的数据类型 单表查询和多表查询 一个单表查询的 ...

  6. SQL Server之游标的基础知识

    什么是游标: 游标是可以在结果集中上下游动的指针. 游标的作用: --允许定位到结果集中的特定行. --从结果集的当前位置检索一行或多行数据. --支持对结果集中当前位置的行进行修改. 注意:游标虽然 ...

  7. SQL SERVER CURSOR游标的使用(转载)

    一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据 ...

  8. SQL SERVER触发器游标小记

    今天接到个需求用触发器来实现通过条件对其他表的更新.好久没摸SQL SERVER,电脑里也没SQL SERVER安装包,同事遂发来个安装包,一看吓一跳,3.6G!!!!经过漫长等待后,开始作业.需求如 ...

  9. SQL Server 利用游标解决Tempdb究极竞争-DBA-程序员需知

    SQL Server tempdb分配竞争算是DBA老生常谈的问题了,几乎现在所有的DBA都知道多建几个文件来解决/缓解问题.但是深层次的的竞争依旧不可避免.这里给大家剖析下游标在tempdb中的特点 ...

  10. sql server中游标

    参考:http://blog.csdn.net/luminji/article/details/5130004 利用SQL Server游标修改数据库中的数据 SQL Server中的UPDATE语句 ...

随机推荐

  1. 使用mongodump将mongodb数据备份带JOSN文件

    备份: 首先,mongodb要连接到指定数据库 在指定数据库目录下,shift+右键--在此次打开命令行--输入以下命令: mongodump -d databaseName -o backup 备份 ...

  2. [8.2] Robot in a Grid

    Imagine a robot sitting on the upper left corner of grid with r rows and c columns. The robot can on ...

  3. PHP用户注册与登录【1】

    需求分析 主要功能分为 用户注册.用户登录.用户退出.用户中心 四个部分. 用户注册 用户注册主要功能有: 注册信息表单填写界面 javascript 脚本初步检测用户输入的注册信息. 注册处理模块检 ...

  4. #研发解决方案#iDB-数据库自动化运维平台

    郑昀 创建于2015/12/2 最后更新于2015/12/2 关键词:数据库,MySQL,自动化运维,AutoDDL,刷库,帐号授权,审核,回滚 提纲: 数据库自动化运维什么?别人家是怎么玩的? 我们 ...

  5. Erlang 初学者技巧及避免的陷阱

    1. 传参或在匿名函数内慎用self() 通常在做消息传递或新建进程的时候我们需要将当前进程的Pid发给目标进程以便接收返回信息,但初学者不留意容易犯以下错误 spawn(fun() -> lo ...

  6. 关于“模仿"和”创新“

    互联网刚刚进入中国的前10年,国内互联网企业基本处于模仿和学习阶段.三大门户新浪.搜狐和网易,师从雅虎:现在如日中天的BAT三巨头,百度学习谷歌.阿里巴巴学习亚马逊和EBAY.腾讯学习ICQ. 关于模 ...

  7. 配置Spark on YARN集群内存

    参考原文:http://blog.javachen.com/2015/06/09/memory-in-spark-on-yarn.html?utm_source=tuicool 运行文件有几个G大,默 ...

  8. spring quartz 配置实现定时任务 详解

    一. 编写定时任务JAVA类 比如: public class QuartzJob {     public QuartzJob(){         System.out.println(" ...

  9. 判断是PC端还是移动端

    http://detectmobilebrowsers.com/ 此网站提供了各种编程语言(包括 Apache.ASP.ASP.NET.C#. IIS. JSP. JavaScript. jQuery ...

  10. java 心得

    11. 最后的笑声 package javaBookPractice; public class LastLaugh { public static void main(String[] args) ...