/*
原理:游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理。
1.1游标的概念
游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。
使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。
用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。
游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
1.2 游标的优点
从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:
1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。
2)提供对基于游标位置的表中的行进行删除和更新的能力。
3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。

1.3 游标的使用
讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。
使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。
1.3.1声明游标
最简单游标声明:DECLARE <游标名>CURSOR FOR<SELECT语句>;
其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询
1.3.2 打开游标
非常简单,我们就打开刚才我们声明的游标mycursor
OPEN mycursor
1.3.3读取数据
FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]
参数说明:
NEXT 取下一行的数据,并把下一行作为当前行(递增)。
由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。
NEXT为默认的游标提取选项。
INTO @变量名[,…] 把提取操作的列数据放到局部变量中。
列表中的各个变量从左到右与游标结果集中的相应列相关联。
各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。
变量的数目必须与游标选择列表中的列的数目一致。

1.3.4关闭游标
CLOSE mycursor
1.3.5删除游标
DEALLOCATE mycursor

给出具体的例子:
*/

----------------------------------------------
declare @ID nvarchar(20); --定义变量来保存ID号
declare @DATE DATETIME;
DECLARE @DFD NVARCHAR(200); --定义变量来保存值
SET @DFD='';
declare mycursor cursor for
select MID,CreatedDate from FD_Menu --为所获得的数据集指定游标
open mycursor --打开游标
fetch next from mycursor into @ID,@DATE --开始抓第一条数据
while(@@fetch_status=0) --如果数据集里一直有数据
begin
--select tb_b.name,(tb_b.gz + @A) from tb_b where tb_b.id = @id --开始做想做的事(什么更新呀,删除呀)
SET @DFD=@DFD+CAST(@ID AS NVARCHAR)+'.V.'+CONVERT(NVARCHAR,@DATE,111);
select @DFD;
fetch next from mycursor into @ID,@DATE --跳到下一条数据
end
close mycursor --关闭游标
deallocate mycursor --删除游标

-------------------------------------------------------------------------
-----------------------循环示例------------------------------------------
-------------------------------------------------------------------------
TRUNCATE TABLE V_TEST

DECLARE @i INT;
SET @i=1;
WHILE @i<1000
BEGIN
INSERT INTO V_TEST (V_Name,V_DESC)values('IamV'+str(@i),'Victor'+str(1000-@i))
SET @i=@i+1
END

SELECT * FROM V_TEST
-------------------------------------------------------------------------
DECLARE @ID BIGINT;
DECLARE @NAME NVARCHAR(50);
DECLARE V_CURSOR CURSOR FOR(
SELECT V_ID,V_Name FROM V_TEST WHERE RIGHT(V_NAME,2)='10'
)
OPEN V_CURSOR;
FETCH NEXT FROM V_CURSOR INTO @ID,@NAME
WHILE (@@FETCH_STATUS=0)
BEGIN
PRINT CAST(@ID AS NVARCHAR)+@NAME;
FETCH NEXT FROM V_CURSOR INTO @ID,@NAME;
END
CLOSE V_CURSOR;
DEALLOCATE V_CURSOR;
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
/*
声明 SCROLL 游标并使用其它 FETCH 选项
scroll表示可随意移动游标指针(否则只能向前)
下例创建一个 SCROLL 游标,使其通过 LAST、PRIOR、RELATIVE 和 ABSOLUTE 选项支持所有滚动能力。
*/
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
--声明局部变量
DECLARE @ID BIGINT;
DECLARE @NAME NVARCHAR(50);
DECLARE V_CURSOR SCROLL CURSOR FOR
SELECT V_ID,V_Name FROM V_TEST;
OPEN V_CURSOR;
--定位到指定位置的记录
FETCH ABSOLUTE 50 from V_CURSOR into @ID,@NAME
select @id as id,@name as name
--定位到当前记录相对位置记录
FETCH RELATIVE -30 from V_CURSOR into @id,@name
select @id as id,@name as name
--定位到当前记录前一条
fetch prior from V_CURSOR into @id,@name
select @id as id,@name as name
--定位到当前记录后一条
fetch next from V_CURSOR into @id,@name
select @id as id,@name as name
--定位到首记录
fetch first from V_CURSOR into @id,@name
select @id as id,@name as name
--定位到尾记录
fetch last from V_CURSOR into @id,@name
select @id as id,@name as name

CLOSE V_CURSOR;
DEALLOCATE V_CURSOR;
-------------------------------------------------------------------------------------
/*

*/
-------------------------------------------------------------------------------------
DECLARE @ID BIGINT;
DECLARE @NAME NVARCHAR(50);
DECLARE V_CURSOR CURSOR SCROLL FOR(
SELECT V_ID,V_Name FROM V_TEST WHERE RIGHT(V_NAME,2)='10'
)
OPEN V_CURSOR;
FETCH NEXT FROM V_CURSOR INTO @ID,@NAME

WHILE (@@FETCH_STATUS=0)
BEGIN
PRINT CAST(@ID AS NVARCHAR)+@NAME;
FETCH RELATIVE 2 FROM V_CURSOR INTO @ID,@NAME;
END

CLOSE V_CURSOR;
DEALLOCATE V_CURSOR;
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
/*
dynamic表示可以读写游标(否则游标只读)
UPDATE V_TEST SET V_DESC='Victor 199' WHERE CURRENT OF V_CURSOR
*/
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
DECLARE V_CURSOR CURSOR SCROLL DYNAMIC
/*scroll表示可随意移动游标指针(否则只能向前)
dynamic表示可以读写游标(否则游标只读)*/
FOR
SELECT V_DESC FROM V_TEST WHERE CAST(RIGHT(V_DESC,3) AS INT)<200

OPEN V_CURSOR
DECLARE @DESC NVARCHAR(50)

FETCH NEXT FROM V_CURSOR INTO @DESC
WHILE(@@fetch_status=0)
BEGIN
PRINT 'Product Name: ' + @DESC
FETCH NEXT FROM V_CURSOR INTO @DESC
END

FETCH FIRST FROM V_CURSOR INTO @DESC
print @DESC
update V_TEST set V_DESC='123122' WHERE CURRENT OF V_CURSOR
/**//*delete from product where current of my_cursor */
CLOSE V_CURSOR
DEALLOCATE V_CURSOR
----------------------------------------------------------------
SELECT * FROM V_TEST
update V_TEST set V_DESC='Victor 199' WHERE V_ID=801
---------------------------------------------------------------------------
---------------------------------------------------------------------------
---------------------------------------------------------------------------
/*
declare my_cursor1 cursor for
select nContentId,dtEditTime from content where datepart(month,dtEditTime)='9' and datepart(day,dtEditTime)='26'
open my_cursor1
declare @date sysname
declare @nID sysname
declare @tempDate datetime
fetch next from my_cursor1 into @nID,@date
while(@@fetch_status = 0)
begin
set @tempDate = dateadd(day,87,@date)
--print @tempDate
update Content set dtEditTime=@tempDate where nContentId = @nID
fetch next from my_cursor1 into @nID,@date
end
close my_cursor1
deallocate my_cursor1

*/

-----------------------
DECLARE @JJ NVARCHAR(10)
SET @JJ='12345';
SET @JJ= RIGHT(@JJ,LEFT(@JJ,1))
PRINT @JJ
----------------------

转: Transact-sql游标使用详解~~很详细的更多相关文章

  1. Java进阶篇之十五 ----- JDK1.8的Lambda、Stream和日期的使用详解(很详细)

    前言 本篇主要讲述是Java中JDK1.8的一些新语法特性使用,主要是Lambda.Stream和LocalDate日期的一些使用讲解. Lambda Lambda介绍 Lambda 表达式(lamb ...

  2. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  3. MySQL SQL查询优化技巧详解

    MySQL SQL查询优化技巧详解 本文总结了30个mysql千万级大数据SQL查询优化技巧,特别适合大数据里的MYSQL使用. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ...

  4. sql各种连接详解

      迁移时间:2017年6月1日16:33:58 CreateTime--2016年9月14日11:19:00Author:Marydon sql各种连接详解 参考链接: http://www.jb5 ...

  5. 【SQL Server】SQL触发器经验详解

    [SQL Server]SQL触发器经验详解 | 浏览: 4314 | 更新: 2013-01-07 15:33 25 11 全文阅读分步阅读   加入杂志 步骤 1 2 3 4 5 6 7 8   ...

  6. Mybatis SQL映射文件详解

    Mybatis SQL映射文件详解 mybatis除了有全局配置文件,还有映射文件,在映射文件中可以编写以下的顶级元素标签: cache – 该命名空间的缓存配置. cache-ref – 引用其它命 ...

  7. Java程序员从笨鸟到菜鸟之(一百零二)sql注入攻击详解(三)sql注入解决办法

    sql注入攻击详解(二)sql注入过程详解 sql注入攻击详解(一)sql注入原理详解 我们了解了sql注入原理和sql注入过程,今天我们就来了解一下sql注入的解决办法.怎么来解决和防范sql注入, ...

  8. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

  9. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

随机推荐

  1. poj2175

    鸣谢: http://www.cppblog.com/y346491470/articles/152317.html [题意]:一个城市有n座建筑物,每个建筑物里面有一些人,为了在战争爆发时这些人都可 ...

  2. 建立一个ROS msg and srv

    msg是一个描述ROS消息字段的简单的文本文件,它们经常用来为消息产生不同语言的源代码. srv文件描述一个服务,它由请求和响应两部分组成. msg文件被存储在一个包的msg目录下,srv文件被存储在 ...

  3. Linux学习之挂载操作

    一.挂载U盘 1.使用命令:fdisk -l,查看系统硬盘和分区情况 2.插入优盘,再次用fdisk -l命令查看     大家可以发现多了一个硬盘/dev/sdb和它的一个分区/dev/sdb1 3 ...

  4. hadoop搭建杂记:Linux下虚拟机集群网络搭建

    VirtualBox搭建hadoop伪分布式模式 VirtualBox搭建hadoop伪分布式模式 master: ip:192.168.56.120 机器名: master 启动NameNode 启 ...

  5. php基础知识--文件操作

    文件操作 文件 广义角度: 任何一个在磁盘上可以看到的符号(包含真正的文件及文件夹) 狭义角度: 真实存储数据的载体(不包含文件夹, 如doc文件,txt文件等) 文件操作: 对文件的增删改查 文件分 ...

  6. 转:Grunt:任务自动管理工具

    Grunt:任务自动管理工具 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 安装 命令脚本文件Gruntfile.js Gruntfile.js实例:gru ...

  7. 快速学习使用 Windows Azure 上的 SharePoint Server 2013

     为了在当今的企业环境中占据一席之地,您需要能够迅速顺应变化和应对挑战.有时,需要及时调整您的SharePoint 基础结构以保持竞争优势. 基础结构即服务可通过随时使用.即付即用的解决方案应对这 ...

  8. cocos2d-x游戏开发(十六)帧动画

    欢迎转载:http://blog.csdn.net/dawn_moon/article/details/11775745 本来想写一下帧动画的,搜了一下网上好像有一大把,就懒得写了,直接贴代码. // ...

  9. iOS 检测更新版本

    获取app版本URL 数字是appID,在开发者账号app信息中可以找到 #define APP_URL @"http://itunes.apple.com/cn/lookup?id=116 ...

  10. <td style="word-break:break-all"> 在html中控制自动换行

    在html中控制自动换行   其实只要在表格控制中添加一句 <td style="word-break:break-all">就搞定了. 其中可能对英文换行可能会分开一 ...