--创建游标
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 ] ] ]
[;] 
--游标类型和游标变量
--定义后直接赋值
Declare text_cursor cursor
for select * from #tb --先定义后赋值
Declare text_cursor cursor
set @text_cursor=cursor
for select * from #tb

案例:动态和静态的游标区别 ---- 游标打开后,对数据表删除,动态的游标会及时的更新数据表,静态游标不会及时的更新数据表IF OBJECT_ID('tempdb..#tb') IS NOT NULL


DROP TABLE #tb CREATE TABLE #tb( id int PRIMARY KEY, col sysname) INSERT #tb( id, col) SELECT 1, 'AA' UNION ALL SELECT 2, 'BB' UNION ALL SELECT 3, 'CC' UNION ALL SELECT 4, 'DD' declare cur_tb cursor local forward_only read_only type_warning dynamic --static
for select* from #tb
--游标打开前删除
delete top(1) from #tb where id=4 select 'before cursor open',* from #tb
open cur_tb
--游标打开后删除
delete top(1) from #tb where id=3 select 'after cursor open',* from #tb
fetch next from cur_tb
fetch cur_tb while @@FETCH_STATUS=0
begin
delete top(1) from #tb where id=1
fetch cur_tb
end --当一次读取赋给变量时,要注意表字段数与变量数一致

declare @id nvarchar(800)
declare @col nvarchar(800)
declare cur_tb cursor local forward_only read_only type_warning dynamic --static
for select* from #tb
open cur_tb
fetch next from cur_tb into @id,@col
print @id
print @col

  

案例: 通过分组用户得到上机时分别是哪个管理员进行管理

create table table1( --drop table 表1

ID     int,

NAME   varchar(10),

QQ     varchar(10),

PHONE  varchar(20)

)
insert into table1 values(1 ,'秦云' ,'10102800' ,'13500000') insert into table1 values(2 ,'在路上' ,'10378' ,'13600000') insert into table1 values(3 ,'LEO' ,'10000' ,'13900000') create table table2( --drop table 表2 ID int, NAME varchar(10) , sjsj datetime, gly varchar(10) ) insert into table2 values(1,'秦云' ,cast('2004-1-1' as datetime),'李大伟') insert into table2 values(2,'秦云' ,cast('2005-1-1' as datetime),'马化腾') insert into table2 values (3,'在路上' ,cast('2005-1-1' as datetime),'马化腾') insert into table2 values(4,'秦云' ,cast('2005-1-1' as datetime),'李大伟') insert into table2 values(5,'在路上' ,cast('2005-1-1' as datetime),'李大伟') select * from table1
select * from table2 create function GetNameStr(@name nvarchar(10))
returns nvarchar(800)
as
begin
declare @nameStr nvarchar(800)
declare @tempStr nvarchar(800)
declare @flag int
declare myCur cursor
for select gly from table2 t2 where t2.name=@name
open myCur
fetch next from myCur into @tempStr set @flag=0
while @@fetch_status=0
begin
if @flag=0
begin
set @nameStr=@tempStr
end
else
begin
set @nameStr=@nameStr+','+@tempStr
end set @flag=@flag+1
fetch next from myCur into @tempStr
end
close myCur
deallocate myCur
return @nameStr
end --游标写法得到的结果
select t2.NAME,COUNT(t2.ID) as 上级次数,dbo.GetNameStr(t2.NAME) from table2 t2
where t2.NAME in (select t1.name from table1 t1) group by t2.NAME --通过面向对象写法得到的结果
select name,count(*) num,gly=stuff((select distinct ','+gly from table2 t1 where t1.NAME=t2.name for xml path('')),1,1,'') from table2 t2 group by name

--网上找到的一些要点

--定义游标时,如果不是特别需要,使用LOCAL关键显式的将游标定义为局部游标,
-- 尽量避免使用全局(GLOBAL,这是数据库的默认行为)游标;没有特殊需要的话,
-- 尽量使用FORWARD_ONLY READ_ONLY STATIC游标,
--FAST_FORWARD可以理解成FORWARD_ONLY的优化版本.FORWARD_ONLY执行的是静态计划,
--而FAST_FORWARD是根据情况进行选择采用动态计划还是静态计划,
--大多数情况下FAST_FORWARD要比FORWARD_ONLY性能略好. --READ_ONLY意味着声明的游标只能读取数据,游标不能做任何更新操作 -- SCROLL_LOCKS是另一种极端,将读入游标的所有数据进行锁定,防止其他程序进行更改,以确保更新的绝对成功 -- OPTIMISTIC是相对比较好的一个选择,OPTIMISTIC不锁定任何数据,当需要在游标中更新数据时,如果底层表数据更新,则游标内数据更新不成功,如果,底层表数据未更新,则游标内表数据可以更新 --(1) 尽管使用游标比较灵活,可以实现对数据集中单行数据的直接操作,但游标会在下面几个方面影响系统的性能:
-- 使用游标会导致页锁与表锁的增加
-- 导致网络通信量的增加
-- 增加了服务器处理相应指令的额外开销
-- (2) 使用游标时的优化问题:
-- 明确指出游标的用途:for read only或for update
-- 在for update后指定被修改的列
--http://www.cnblogs.com/CareySon/archive/2011/11/01/2231381.html
--http://www.cnblogs.com/knowledgesea/p/3699851.html
--http://blog.csdn.net/szstephenzhou/article/details/7244949

  

sql 游标的更多相关文章

  1. sql 游标例子 根据一表的数据去筛选另一表的数据

    sql 游标例子 根据一表的数据去筛选另一表的数据 DECLARE @MID nvarchar(20)DECLARE @UTime datetime DECLARE @TBL_Temp table( ...

  2. sql 游标循环当中重新赋值

    sql 游标循环当中的变量必须重新赋值不然变量的值就是前次循环的值

  3. SQL 游标的应用

    ----------------SQL游标应用-----------------if object_id('tempdb..#test0001') is not null drop table #te ...

  4. PL/SQL 游标 (实验七)

    PL/SQL 游标 emp.dept 目标表结构及数据 要求 基于部门表建立游标dept_cursor1,使用记录变量接收游标数据,输出部门表信息: 显示格式: 部 门 号: XXX 部门名称: XX ...

  5. PL/SQL游标详解

    刚打开游标的时候,是位于一个空行,要用fetch into 才能到第一行. 只是要注意用更新游标的时候,不能在游标期间commit. 否则会报ORA-01002: fetch out of seque ...

  6. 网上看到一份详细sql游标说明 《转载 https://www.cnblogs.com/xiongzaiqiren/p/sql-cursor.html》

     SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获 ...

  7. Oracle PL/SQL游标

    游标的提出: SQL是面向集合的,其结果一般是集合量(多条记录),而PL/SQL的变量一本是标量,其一组变量异常一直只能存放一条记录.所以仅仅使用变量并不能完全满足SQL语句向应用程序输出数据的要求. ...

  8. PL/SQL 游标

    本随笔不是原创,只是学习笔记,用于加深记忆,原创地址PL/SQL --> 游标 一.游标的相关概念和特性 1.定义: 映射到结果集中的某一行的特定位置,类似与C语言中的指针.即通过游标方式定位到 ...

  9. Library Cache优化与SQL游标

    Library Cache主要用于存放SQL游标,而SQL游标最大化共享是Library Cache优化的重要途径,可以使SQL运行开销最低.性能最优. 1 SQL语句与父游标及子游标 在PL/SQL ...

  10. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

随机推荐

  1. 错误-spring3.2的架构在tomcat6.0中无法正常启动,抛出java.lang.NoClassDefFoundError: javax/servlet/AsyncListener

    原因分析: 1:org.springframework.web.servlet-3.2支持Servlet3.0的版本. 2:tomcat6.0只支持Servlet2.5,而tomcat7.0支持Ser ...

  2. Web 服务器 low bandth DOS attack

    https://www.owasp.org/images/0/04/Roberto_Suggi_Liverani_OWASPNZDAY2010-Defending_against_applicatio ...

  3. IE中cookie问题,带下划线的前置域名会不给设cookie,谷歌和火狐浏览器则不受影响

    !! WARNING !!: Server hostname contains an underscore and this response sets a cookie. Internet Expl ...

  4. C# MVC jsonp初接触成功

    利用jsonp进行跨域请求资源 C# MVC ApiControllers准备如下: 1.需要在引用处右键管理NuGet安装jsonp插件 2.在Application_Start()中配置 Glob ...

  5. hdu 1559 最大子矩阵

    最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  6. Linux下man手册使用

    在 linux 环境下,为了查看一下 free 函数的原型,执行 man free 命令,发现显示结果为系统的 free 命令帮助,而不是库文件中的 free 函数帮助.查阅了一下,发现 man 的使 ...

  7. Hadoop: Hadoop Cluster配置文件

    Hadoop配置文件 Hadoop的配置文件: 只读的默认配置文件:core-default.xml, hdfs-default.xml, yarn-default.xml 和 mapred-defa ...

  8. redhat 更新 python 为 2.7.6

    1. 下载 wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tgz 2. 解压,编译 tar zxvf Python-2.7.6.tgz ./ ...

  9. python与ruby的差别

    1.引用文件差别 Ruby:同一目录下的文件,如/usr/local/ruby/foo.rb与/usr/local/ruby/bar.rb两个文件.如果直接在foo.rb中 require 'bar' ...

  10. Breeze库API总结(Spark线性代数库)(转载)

    导入 import breeze.linalg._ import breeze.numerics._ Spark Mllib底层的向量.矩阵运算使用了Breeze库,Breeze库提供了Vector/ ...