/*
原理:游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理。
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
----------------------

最新文章

  1. C# 利用占位符替换word中的字符串和添加图片
  2. Python札记 -- 装饰器补充
  3. js编写当天简单日历
  4. redis的单实例配置+web链接redis
  5. Android sqlite cursor的遍历
  6. as3+java+mysql(mybatis) 数据自动工具(四)
  7. MongoDB log4j 日志整合
  8. 关于iostream的效率问题
  9. Tween动画
  10. hibernate操作步骤(代码部分)
  11. c#中RGB与int类型之间的转换
  12. 22.jQuery(实例)
  13. cmd实现cab文件的压缩与解压
  14. js 冒泡排序、快速排序、去重、查找字符串最多值(面试常有)
  15. 能递归检查DataAnnotations的验证函数
  16. 9. Oracle DataGuard的介绍
  17. PHP利用反射根据类名反向寻找类所在文件
  18. 超实用教程,教你用墨刀做出小红书app原型
  19. sitecore系统教程之部署架构方式分析
  20. RocketMQ 事务消息

热门文章

  1. 谷歌识图、google识图如何知道图片相似?
  2. Gridpanel多种操作帮助文档
  3. html object元素
  4. video详解 HTML5中的视频:
  5. 简单介绍一下ODI的几个基本概念
  6. Android Material Design 之 Toolbar的使用
  7. Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)
  8. 2014年辛星Javascript解读第二节
  9. Objective-C中NSArray和NSMutableArray的基本用法
  10. 搭建Myeclipse下Java Web开发环境