原创文章,转载必需注明出处:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/introduce-for-sqlserver-cursor-2/

上一节我们简单讲解了SqlServer的游标的简单创建,本节我们将根据msdn上的创建游标代码来详细讲解游标的创建、以及其特性。

 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 ] ] ]
[;]

一、创建游标

(a)、LOCAL 和GLOBAL

就像C#或C++等编程语言一样,使用sql语言创建游标也可以创建全局游标和局部游标。Local意味着游标的声明周期在函数获得存储过程中是可用的,Global意味着游标全局有效。如果不指定游标作用域,默认作用域为Global

如下:

 declare @table Table(Id int)
declare @i int=0
while @i<100
begin
insert into @table values(@i)
set @i=@i+1;
end declare My_Cursor1 cursor global for select * from @table
declare My_Cursor2 cursor local for select * from @table
declare My_Cursor3 cursor for select * from @table go
open My_Cursor1
open My_Cursor2
open My_Cursor3

(b)、 FORWARD_ONLY 和 SCROLL

游标是针对数据集的,那么它在读取数据集的时候就有其读取数据的方向。 FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项,而SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动,如下:

 --不加参数默认为forward_only
declare My_Cursor1 cursor for select * from @table
declare My_Cursor2 cursor forward_only for select * from @table
declare My_Cursor3 cursor scroll for select * from @table open My_Cursor1
open My_Cursor3
open My_Cursor3 fetch last from My_Cursor1
fetch last from My_Cursor2
fetch last from My_Cursor3

(c)、[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]

[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]

至于上面几种情况笔者也不是太了解,就先跳过介绍

二、打开游标

创建完成游标后我们还要打开游标才能正确的使用游标:代码如下:

 open My_Cursor1
open My_Cursor3
open My_Cursor3

三、使用游标

使用游标分为两部分:一是操作游标的指向,二是操作游标指向的数据行。

游标支持使用6中指向操作。分别是:第一行(first),最后一行(LAST),下一行(next),上一行(prior),直接跳到某一行(absolute(n)),相对于目前跳几行(relative(n)),代码如下:

 --指定参数scroll后方可使用6种游标指向参数,对于未指定scroll参数的则默认读取下一行数据
declare @id int
declare My_Cursor cursor scroll for select * from @table
open My_Cursor
--指向下一行数据
fetch next from My_Cursor into @id
--指向上一行数据
fetch prior from My_Cursor into @id
--指向第一行数据
fetch first from My_Cursor into @id
--指向最后一行数据
fetch last from My_Cursor into @id
--直接跳转到某行数据
fetch absolute 12 from My_Cursor into @id
--相对于目前来说上两行数据
fetch relative -2 from My_Cursor into @id

游标经常会和全局变量@@FETCH_STATUS与WHILE循环来共同使用,以达到遍历游标所在数据集的目的,例如:

 declare @id int
declare My_Cursor cursor scroll for select * from @table
open My_Cursor
--指向下一行数据
fetch next from My_Cursor into @id
while @@FETCH_STATUS=0
begin
select @id
End

四、关闭游标

游标使用完后必须要关闭,代码如下:

close My_Cursor

五、释放游标

当游标不再需要被使用后,释放游标。代码如下:

deallocate My_Cursor

SqlServer之游标深入的更多相关文章

  1. SqlServer 利用游标批量更新数据

    SqlServer 利用游标批量更新数据 Intro 游标在有时候会很有用,在更新一部分不多的数据时,可以很方便的更新数据,不需要再写一个小工具来做了,直接写 SQL 就可以了 Sample 下面来看 ...

  2. 【SqlServer】SqlServer的游标使用

    什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据 ...

  3. SQLServer中游标是如何处理数据的?

    游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力.我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许 ...

  4. Sqlserver 关于游标

    对于sql来说查询的思维方式的面向集合对于游标来说:思维方式是面向行的 性能上:游标会吃更多内存,减少可见的并发,锁定资源等 当穷尽了while循环,临时表,表变量,自建函数,或其他方式仍然无法实现某 ...

  5. sqlserver 使用游标过程中出现的错误

    下面的见解是在使用游标的过程中做的日记.我也是第一次使用,如果有什么不对的地方请批评指正,大家一起努力. 1. 消息 16951,级别 16,状态 1,过程 usp_proc,第 16 行      ...

  6. SQLServer中游标实例介绍(转)

    引言 我们先不讲游标的什么概念,步骤及语法,先来看一个例子: 表一 OriginSalary                      表二 AddSalary 现在有2张表,一张是OriginSal ...

  7. SQLserver 存储过程游标使用

    ALTER PROCEDURE [dbo].[p_DeleteStretchData] ) , ) AS BEGIN ) ) declare @stretch_cursor cursor -- 声明游 ...

  8. 使用sqlserver的游标功能来导数据的常见写法

    一定要自己试过才知道么? 你也没试过吃屎,你怎么知道屎不能吃,难道你试过啊...(没有愤怒的意思) ),),) declare cursor_data CURSOR FOR SELECT [UserN ...

  9. sqlserver 存储过程 游标实例

    if exists(select * from sysobjects where id = object_id(N'dbo.test_cursor') and type = 'P') drop PRO ...

随机推荐

  1. Spring Auto-Wiring Beans

    In Spring framework, you can wire beans automatically with auto-wiring feature. To enable it, just d ...

  2. RTT操作系统

    http://www.rt-thread.org/官网 RT-Thread RTOS,由国内一些专业开发人员开发.维护.它不仅仅是一款 高效.稳定的实时操作系统内核,也是一套面向嵌入式系统的软件平台, ...

  3. HDU 2586 How far away ? (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #incl ...

  4. java应用CPU占用率过高问题的分析

    使用top查询哪个进程占用CPU过高 查看CPU占用高的进程中,哪个线程占用CPU高 可通过以下三种方式查看: 1 top中按SHIFT+H查找哪个线程占用高 2 top -H -p PID命令查看哪 ...

  5. wikioi 3116 高精度练习之加法

    题目描述 Description 给出两个正整数A和B,计算A+B的值.保证A和B的位数不超过500位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Outpu ...

  6. 瑞丽的SQL-基于窗体的排名计算

    在SQL Server中,窗体被定义为用户指定的一组行. 之所以要提出窗体这个概念,由于这种基于窗体或分区的又一次计算在实际工作应用范围比較广泛.比如.假设我们要对每一个班级中的学生按成绩进行排序,在 ...

  7. C++ 析构方法

    1.什么是析构方法? 析构方法与构造方法互补. 2.为什么设计析构方法? 构造方法创建一个对象,对象内部往往还会申请一些资源.设计析构方法的目的是 释放资源,同时销毁自身. 3.析构方法可以认为分为两 ...

  8. Codeforces Gym 100513I I. Sale in GameStore 暴力

    I. Sale in GameStore Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100513/p ...

  9. QT5 串口收发实例代码

    以下代码是自己测试门禁系统使用的 主要用到了串口的接收和发送  开发环境:xp  QT5.1.1 串口:38400   N  8  1 自动检测可用串口 在xp上测试没问题 有些usb转串口会出现波特 ...

  10. cocos2dx3.2 画图方法小修改之 C++ final学习

    今天用cocos2dx 3.2版本号学习画图功能,       于是我重载Node 的draw方法.发现报错, watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...