在Sql Server存储过程中使用Cursor(游标)操作记录
数据库cursor的用法

数据库cursor的用法1. 嘿,你知道数据库 cursor 就像一把神奇的钥匙吗?比如说,在处理大量数据时,cursor 能精准地找到我们需要的那部分,就像在茫茫人海中一下子认出自己要找的那个人!2. 哎呀呀,数据库 cursor 可是个大宝贝呀!想想看,它能带着我们在数据的海洋里畅游,就像有一艘专属的小船,比如我们要分析某个时间段的销售数据,cursor 就能准确地带我们到达那里。
3. 哇塞,你们晓得不,数据库 cursor 用起来那叫一个爽!好比我们在迷宫里,它就是那根能指引我们走出困境的线,举个例子,在查询复杂的关联数据时,它就会大显身手啦!4. 嘿,可别小瞧数据库 cursor 啊,它可厉害着呢!它就像是一个贴心的向导,随时带你找到数据的宝藏,比如查找特定客户的所有订单信息,cursor 轻松就能搞定。
5. 哇哦,数据库 cursor 真的是太重要啦!简直就是我们处理数据的好帮手呀,像打开宝藏的密码一样关键,假设要统计某个地区的用户数量,cursor 就能发挥关键作用呀。
6. 哎呀,数据库 cursor 的用法你们一定要搞清楚哇!这可关系重大呀,就像战场上的利器一样,比如要提取某一类特定数据时,cursor 绝对不会让你失望。
7. 嘿,听我说呀,数据库cursor 那可是不可或缺的呀!它就像夜晚的明灯,给我们指明方向,比如在更新大量数据时,cursor 就能确保准确无误地进行操作。
8. 哇,数据库 cursor 真的是太神奇了吧!简直就是魔法一样的存在呀,就像拥有了超能力,打个比方,要遍历一个巨大的数据集合时,cursor 就能大展神威啦。
9. 总之,数据库 cursor 的作用非常强大,一定要熟练掌握它的用法,学会了它,就等于拥有了在数据世界里自由穿梭的能力,这可不是开玩笑的呀!。
cursor for游标的使用和解析

cursor for游标的使用和解析
游标是一种在数据库中进行数据操作的工具,它可以让我们在查询结果集中逐行移动,并且可以对每一行的数据进行操作和解析。
游标通常用于需要对大量数据进行处理或分析的情况下,它可以提高操作的效率和灵活性。
在使用游标之前,我们首先需要声明一个游标变量,并且定义游标的类型、查询语句和游标属性等。
可以使用DECLARE语句来声明游标,并且可以选择性地指定游标的属性,例如是否允许滚动、是否允许更新等。
接下来,我们可以使用OPEN语句来打开游标,该语句会执行查询语句,并将结果集保存到游标中。
一旦游标被打开,我们可以使用FETCH语句来逐行获取游标中的数据。
FETCH语句可以指定从游标中获取的行数,也可以使用循环来逐行获取所有数据。
在处理完游标中的数据后,我们可以使用CLOSE语句来关闭游标,并释放相关的资源。
在关闭游标之前,我们还可以使用UPDATE或DELETE语句来更新或删除游标中的数据。
同时,我们还可以通过检查游标的状态来判断游标是否打开,以避免重复打开或关闭游标。
需要注意的是,在使用游标时要避免对大量数据进行频繁的单行操作,因为这样会造成较大的性能开销。
可以考虑使用批量操作或临时表来优化处理过程。
总之,游标是一种强大的工具,可以帮助我们在数据库中进行复杂的数据处理和解析。
使用游标需要注意合理设置游标属性,并避免频繁的单行操作,以提高处理效率。
存储过程cursor用法

存储过程cursor用法摘要:一、cursor概述1.cursor的定义2.cursor的作用二、cursor的用法1.声明cursor2.打开cursor3.获取cursor数据4.关闭cursor5.释放cursor三、cursor应用实例1.员工信息查询2.订单信息查询正文:cursor是存储过程(stored procedure)中的一种数据控制语句,它允许我们在执行复杂查询时,对查询结果进行逐行处理。
cursor提供了一种机制,使我们能够遍历查询结果集并处理每一行数据。
在本文中,我们将详细介绍cursor的用法及其在存储过程中的应用。
一、cursor概述1.cursor的定义cursor是一种游标,它是一个数据库对象,用于在存储过程中处理查询结果集。
cursor允许我们在查询执行过程中,对结果集进行遍历和处理。
2.cursor的作用cursor的主要作用是在存储过程中逐行处理查询结果集,它提供了一种机制,使我们能够对每一行数据进行操作,例如插入、更新或删除。
二、cursor的用法1.声明cursor在存储过程中,首先需要声明一个cursor变量。
声明cursor的语法如下:```DECLARE cursor_name CURSOR FOR SELECT column1,column2, ...FROM table_name WHERE condition;```其中,`cursor_name`是游标名称,`column1`、`column2`等是查询结果集中的列名,`table_name`是表名,`condition`是查询条件。
2.打开cursor声明cursor后,需要使用`OPEN`关键字打开cursor。
打开cursor的语法如下:```OPEN cursor_name;```3.获取cursor数据打开cursor后,可以使用`FETCH`关键字获取cursor的数据。
FETCH语句的语法如下:```FETCH cursor_name INTO variable;```其中,`variable`是用于存储查询结果的变量。
SQLServer游标详解

SQLServer游标详解⼀、⽤到的数据CREATE TABLE[dbo].[XSB]([学号][char](6) NOT NULL,[姓名][char](8) NOT NULL,[性别][bit]NULL,[出⽣时间][date]NULL,[专业][char](12) NULL,[总学分][int]NULL,[备注][varchar](500) NULL,PRIMARY KEY CLUSTERED([学号]ASC)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON[PRIMARY] ) ON[PRIMARY]GOinsert into XSB values('081101','王林','true','1990-2-10','计算机',50,null),('081102','陈平','true','1991-2-1','计算机',50,null),('081103','王燕','false','1989-10-6','计算机',50,null),('081104','韦严平','true','1990-8-26','计算机',50,null),('081106','李芳芳','true','1990-11-20','计算机',50,null),('081107','李明','true','1990-5-1','计算机',54,'已提前修完数据结构,并获学分'),('081108','林⼀凡','true','1989-8-5','计算机',52,'已提前修完⼀门课'),('081109','张强民','true','1989-8-11','计算机',50,null),('081110','张蔚','false','1991-7-22','计算机',50,'三好⽣'),('081111','赵琳','false','1989-10-6','计算机',50,null),('081113','严红','false','1989-8-11','计算机',48,'⼀门不及格,待补考'),('081201','王敏','true','1989-6-10','通信⼯程',42,null),('081202','王林','true','1989-6-10','通信⼯程',40,'⼀门不及格,待补考')GO⼆、游标概念我们知道,关系数据库所有的关系运算其实是集合与集合的运算,它的输⼊是集合输出同样是集合,有时需要对结果集逐⾏进⾏处理,这时就需要⽤到游标。
Sql存储过程游标循环的用法及sql如何使用cursor写一个简单的循环

Sql存储过程游标循环的⽤法及sql如何使⽤cursor写⼀个简单的循环⽤游标,和WHILE可以遍历您的查询中的每⼀条记录并将要求的字段传给变量进⾏相应的处理==================DECLARE@A1 VARCHAR(10),@A2 VARCHAR(10),@A3 INTDECLARE CURSOR YOUCURNAME FOR SELECT A1,A2,A3 FROM YOUTABLENAMEOPEN YOUCURNAMEfetch next from youcurname into @a1,@a2,@a3while @@fetch_status<>-1beginupdate … set …-a3 where ………您要执⾏的操作写在这⾥fetch next from youcurname into @a1,@a2,@a3endclose youcurnamedeallocate youcurname—————————————在应⽤程序开发的时候,我们经常可能会遇到下⾯的应⽤,我们会通过查询数据表的记录集,循环每⼀条记录,通过每⼀条的记录集对另⼀张表进⾏数据进⾏操作,如插⼊与更新,我们现在假设有⼀个这样的业务:⽼师为所在班级的学⽣选课,选的课程如有哲学、马克思主义政治经济学、⽑泽东思想概论、邓⼩平理论这些课,现在操作主要如下:1) 先要查询这些还没有毕业的这些学⽣的名单,毕业过后的⽆法进⾏选课;2) 在批量的选取学⽣的同时,还需要添加对应的某⼀门课程;3) 点添加后选课结束。
数据量少可能看不出⽤Java程序直接多次进⾏数据库操作这种办法实现的弱点,因为它每次在操作数据库的时候,都存在着频繁的和数据库的I/O直接交互,这点性能的牺牲实属不应该,那我们就看下⾯的⽅法,通过存储过程的游标⽅法来实现:建⽴存储过程:Create PROCEDURE P_InsertSubject@SubjectId intASDECLARE rs CURSOR LOCAL SCROLL FORselect studentid from student where StudentGradu = 1OPEN rsFETCH NEXT FROM rs INTO @tempStudentIDWHILE @@FETCH_STATUS = 0BEGINInsert SelSubject values (@SubjectId,@tempStudentID)FETCH NEXT FROM rs INTO @tempStudentIDENDCLOSE rsGO使⽤游标对记录集循环进⾏处理的时候⼀般操作如以下⼏个步骤:1、把记录集传给游标;2、打开游标3、开始循环4、从游标中取值5、检查那⼀⾏被返回6、处理7、关闭循环8、关闭游标上⾯这种⽅法在性能上⾯⽆疑已经是提⾼很多了,但我们也想到,在存储过程编写的时候,有时候我们尽量少的避免使⽤游标来进⾏操作,所以我们还可以对上⾯的存储过程进⾏改造,使⽤下⾯的⽅法来实现:Create PROCEDURE P_InsertSubject@SubjectId intASdeclare @i int,@studentidDECLARE @tCanStudent TABLE(studentid int,FlagID TINYINT)BEGINinsert @tCanStudent select studentid,0 from student where StudentGradu = 1SET @i=1WHILE( @i>=1)BEGINSELECT @studentid=''SELECT TOP 1 @studentid = studentid FROM @tCanStudent WHERE flagID=0SET @i=@@ROWCOUNTIF @i<=0 GOTO Return_LabInsert SelSubject values (@SubjectId,@studentid)IF @@error=0UPDATE @tCanStudent SET flagID=1 WHERE studentid = @studentidReturn_Lab:ENDEndGO我们现在再来分析以上这个存储过程,它实现的⽅法是先把满⾜条件的记录集数据存放到⼀个表变量中,并且在这个表变量中增加⼀个FLAGID进⾏数据初始值为0的存放,然后去循环这个记录集,每循环⼀次,就把对应的FLAGID的值改成1,然后再根据循环来查找满⾜条件等于0的情况,可以看到,每循环⼀次,处理的记录集就会少⼀次,然后循环的往选好课程表⾥⾯插⼊,直到记录集的条数为0时停⽌循环,此时完成操作。
sql中cursor的用法

sql中cursor的用法SQL中的Cursor用法在SQL中,Cursor(游标)是一种用于处理查询结果集的机制,它允许我们逐行处理查询结果,类似于在程序中使用迭代器来遍历集合。
本文将介绍Cursor的用法,包括Cursor的声明、打开、关闭以及使用过程中的注意事项。
1. Cursor的声明在SQL中,我们首先需要声明一个Cursor来定义要处理的查询结果集。
Cursor的声明通常包括以下几个步骤:(1)使用DECLARE关键字声明Cursor的名称和数据类型。
例如:DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name;(2)使用OPEN关键字打开Cursor,使其准备好返回数据。
例如:OPEN cursor_name;(3)使用FETCH NEXT关键字获取第一行数据,并将光标移动到下一行。
例如:FETCH NEXT FROM cursor_name INTO @variable1, @variable2;(4)使用CLOSE关键字关闭Cursor,释放相关资源。
例如:CLOSE cursor_name;(5)使用DEALLOCATE关键字释放Cursor的内存空间。
例如:DEALLOCATE cursor_name;2. Cursor的使用Cursor的使用通常包括以下几个步骤:(1)声明一个Cursor并打开它。
(2)使用FETCH NEXT语句获取第一行数据,并将光标移动到下一行。
(3)使用WHILE循环来遍历查询结果集,直到所有行都被处理完毕。
(4)在循环中,可以根据需要对每一行数据进行处理,例如进行计算、更新或删除操作等。
(5)在循环结束后,关闭Cursor并释放相关资源。
3. Cursor的注意事项在使用Cursor时,需要注意以下几点:(1)Cursor的声明和使用应该放在BEGIN和END之间,以确保它们在同一个作用域内。
SQL游标(cursor)详细说明及内部循环使用示例
SQL游标(cursor)详细说明及内部循环使⽤⽰例游标 游标(cursor)是系统为⽤户开设的⼀个数据缓冲区,存放SQL语句的执⾏结果。
每个游标区都有⼀个名字,⽤户可以⽤SQL语句逐⼀从游标中获取记录,并赋给主变量,交由主语⾔进⼀步处理。
游标是处理结果集的⼀种机制吧,它可以定位到结果集中的某⼀⾏,多数据进⾏读写,也可以移动游标定位到你所需要的⾏中进⾏操作数据。
⼀般复杂的存储过程,都会有游标的出现,他的⽤处主要有:1. 定位到结果集中的某⼀⾏。
2. 对当前位置的数据进⾏读写。
3. 可以对结果集中的数据单独操作,⽽不是整⾏执⾏相同的操作。
4. 是⾯向集合的数据库管理系统和⾯向⾏的程序设计之间的桥梁。
优点 在数据库中,游标是⼀个⼗分重要的概念。
游标提供了⼀种对从表中检索出的数据进⾏操作的灵活⼿段,就本质⽽⾔,游标实际上是⼀种能从包括多条数据记录的结果集中每次提取⼀条记录的机制。
游标总是与⼀条SQL 查询语句相关联因为游标由结果集(可以是零条、⼀条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。
当决定对结果集进⾏处理时,必须声明⼀个指向该结果集的游标。
如果曾经⽤C 语⾔写过对⽂件进⾏处理的程序,那么游标就像您打开⽂件所得到的⽂件句柄⼀样,只要⽂件打开成功,该⽂件句柄就可代表该⽂件。
对于游标⽽⾔,其道理是相同的。
可见游标能够实现按与传统程序读取平⾯⽂件类似的⽅式处理来⾃基础表的结果集,从⽽把表中数据以平⾯⽂件的形式呈现给程序。
我们知道关系数据库管理系统实质是⾯向集合的,在MS SQL SERVER 中并没有⼀种描述表中单⼀记录的表达形式,除⾮使⽤where ⼦句来限制只有⼀条记录被选中。
因此我们必须借助于游标来进⾏⾯向单条记录的数据处理。
由此可见,游标允许应⽤程序对查询语句select 返回的⾏结果集中每⼀⾏进⾏相同或不同的操作,⽽不是⼀次对整个结果集进⾏同⼀种操作;它还提供对基于游标位置⽽对表中数据进⾏删除或更新的能⼒;⽽且,正是游标把作为⾯向集合的数据库管理系统和⾯向⾏的程序设计两者联系起来,使两个数据处理⽅式能够进⾏沟通。
sqlserver中的循环遍历(普通循环和游标循环)
sqlserver中的循环遍历(普通循环和游标循环)sql 经常⽤到循环,下⾯介绍⼀下普通循环和游标循环1、⾸先需要⼀个测试表数据Student2、普通循环1)循环5次来修改学⽣表信息--循环遍历修改记录--declare @i intset @i=0while @i<5beginupdate Student set demo = @i+5 where Uid=@iset @i=@i +1end--查看结果--select * from Student2)执⾏后的查询结果3、游标循环(没有事务)1)根据学⽣表实际数据循环修改信息---游标循环遍历--begindeclare @a int,@error intdeclare @temp varchar(50)set @a=1set @error=0--申明游标为Uiddeclare order_cursor cursorfor (select [Uid] from Student)--打开游标--open order_cursor--开始循环游标变量--fetch next from order_cursor into @tempwhile @@FETCH_STATUS = 0 --返回被 FETCH语句执⾏的最后游标的状态--beginupdate Student set Age=15+@a,demo=@a where Uid=@tempset @a=@a+1set @error= @error + @@ERROR --记录每次运⾏sql后是否正确,0正确fetch next from order_cursor into @temp --转到下⼀个游标,没有会死循环endclose order_cursor --关闭游标deallocate order_cursor --释放游标endgo--查看结果--select * from Student2)执⾏后的查询结果4、游标循环(事务)1)根据实际循环学⽣表信息---游标循环遍历--begindeclare @a int,@error intdeclare @temp varchar(50)set @a=1set @error=0begin tran --申明事务--申明游标为Uiddeclare order_cursor cursorfor (select [Uid] from Student)--打开游标--open order_cursor--开始循环游标变量--fetch next from order_cursor into @tempwhile @@FETCH_STATUS = 0 --返回被 FETCH语句执⾏的最后游标的状态-- beginupdate Student set Age=20+@a,demo=@a where Uid=@tempset @a=@a+1set @error= @error + @@ERROR --记录每次运⾏sql后是否正确,0正确 fetch next from order_cursor into @temp --转到下⼀个游标endif @error=0begincommit tran --提交事务endelsebeginrollback tran --回滚事务endclose order_cursor --关闭游标deallocate order_cursor --释放游标endgo--查看结果--select * from Student2)执⾏后的查询结果:。
sql server 游标的使用例子
SQL Server游标的使用例子1.概述SQL Server是一种常用的关系型数据库管理系统,它提供了多种数据访问和处理的工具和功能。
其中,游标是一种用来在SQL Server中逐行处理数据的重要工具。
本文将介绍SQL Server游标的使用方法和例子。
2.游标的基本概念游标是一种用来在SQL Server中逐行处理数据的机制。
它允许用户逐行访问数据集,对每一行数据进行操作。
游标可以在存储过程或触发器中使用,以实现对数据的逐行处理。
3.游标的使用方法SQL Server中使用游标需要经过以下几个步骤:1) 声明游标:使用DECLARE语句声明游标,并定义游标的属性,如游标的名称、数据集的名称等。
2) 打开游标:使用OPEN语句打开游标,将数据集的内容加载到游标中,以供后续的处理。
3) 读取数据:使用FETCH语句逐行读取游标中的数据,处理每一行数据。
4) 关闭游标:使用CLOSE语句关闭游标,释放与游标相关的资源。
5) 销毁游标:使用DEALLOCATE语句销毁游标,释放游标占用的内存。
4.游标的使用例子下面通过一个简单的例子来介绍SQL Server游标的使用方法。
假设有一个名为"Employee"的表,表中包含员工的ID、尊称和薪水等字段。
现在需要计算每个员工的薪水涨幅,并将结果输出。
可以通过游标来实现这个需求。
```sql-- 声明变量DECLARE EmployeeID INT, EmployeeName NVARCHAR(50), Salary DECIMAL(10, 2), Increment DECIMAL(10, 2)-- 声明游标DECLARE employee_cursor CURSOR FORSELECT EmployeeID, EmployeeName, SalaryFROM Employee-- 打开游标OPEN employee_cursor-- 读取数据FETCH NEXT FROM employee_cursor INTO EmployeeID, EmployeeName, SalaryWHILE FETCH_STATUS = 0BEGINSET Increment = Salary * 0.1 -- 假设薪水涨幅为10PRINT 'Employee ' + EmployeeName + '''s salary will increase by ' + CONVERT(NVARCHAR(20), Increment)FETCH NEXT FROM employee_cursor INTO EmployeeID, EmployeeName, SalaryEND-- 关闭游标CLOSE employee_cursor-- 销毁游标DEALLOCATE employee_cursor```以上代码中,首先声明了一些变量,然后声明了游标"employee_cursor",并使用SELECT语句将"Employee"表中的数据加载到游标中。
PLSQL中CURSOR的用法
今天简单的总结一下PL/SQL中cursor(光标/游标)的用法.相信不少做开发或维护的DBA在找工作的时候,遇到过类似的面视问题:请简单的描述一下光标的类型,说一下普通光标和REF光标之间的区别,以及什么时候该正确应用哪一个?这个题目,我着实难住了不少人,其实他们在具体开发的时候,也还是比较能够把握正确的光标的使用的,但就是说不出来,当然了,这与大家自身的沟流交通能力是有关系的。
有的人不善于说,但做的却很好。
扯的扯就走远了,最后唠叨一下:做技术这条路,能干不能说,或者说会干不会包装,路是走不"远"的.显式cursor显式是相对与隐式cursor而言的,就是有一个明确的声明的cursor.显式游标的声明类似如下(详细的语法参加plsql ref doc )cursor cursor_name (parameter list) is select ...游标从declare、open、fetch、close是一个完整的生命旅程。
当然了一个这样的游标是可以被多次open进行使用的,显式cursor是静态cursor,她的作用域是全局的,但也必须明白,静态cursor也只有pl/sql代码才可以使用她。
下面看一个简单的静态显式cursor的示例:declarecursor get_gsmno_cur (p_nettype in varchar2) is select gsmnofrom gsm_resourcewhere nettype=p_nettype and status='0'; v_gsmno gsm_resource.gsmno%type;beginopen get_gsmno_cur('139');loopfetch get_gsmno_cur into v_gsmno;exit when get_gsmno_cur%notfound; dbms_output.put_line(v_gsmno);end loop;close emp_cur;open get_gsmno_cur('138');loopfetch get_gsmno_cur into v_gsmno;exit when get_gsmno_cur%notfound; dbms_output.put_line(v_gsmno);end loop;close get_gsmno_cur;end;/上面这段匿名块用来实现选号的功能,我们显式的定义了一个get_gsmno_cur,然后根据不同的号段输出当前系统中该号短对应的可用手机号码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.为何使用游标:使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。
用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。
游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。
2.如何使用游标:一般地,使用游标都遵循下列的常规步骤:(1) 声明游标。
把游标与T-SQL语句的结果集联系起来。
(2)打开游标。
(3)使用游标操作数据。
(4)关闭游标。
2.1.声明游标DECLARE CURSOR语句SQL-92标准语法格式:DECLARE游标名[ INSENSITIVE ] [ SCROLL ] CURSORFOR sql-statementEg:Declare MycrsrVar CursorFOR Select * FROM tbMyData2.2打开游标OPEN MycrsrVar当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。
就本例而言,可以使用下列操作读取第1行数据:FETCH FIRST from E1cursor或FETCH NEXT from E1cursor2.3 使用游标操作数据下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动DECLARE E1cursor cursorFOR SELECT * FROM c_exampleOPEN E1cursorFETCH NEXT from E1cursorWHILE @@FETCH_STATUS = 0BEGINFETCH NEXT from E1cursorENDCLOSE E1cursorDEALLOCATE E1cursor2.4 关闭游标使用CLOSE语句关闭游标CLOSE { { [ GLOBAL ]游标名} |游标变量名}使用DEALLOCATE语句删除游标,其语法格式如下:DEALLOCATE { { [ GLOBAL ]游标名} | @游标变量名3. FETCH操作的简明语法如下:FETCH[ NEXT | PRIOR | FIRST | LAST]FROM{游标名| @游标变量名} [ INTO @变量名[,…] ]参数说明:NEXT 取下一行的数据,并把下一行作为当前行(递增)。
由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。
NEXT为默认的游标提取选项。
INTO @变量名[,…] 把提取操作的列数据放到局部变量中。
列表中的各个变量从左到右与游标结果集中的相应列相关联。
各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。
变量的数目必须与游标选择列表中的列的数目一致。
--------------------------------------------------------------------------------------------------------------------------------每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。
该变量有三种状态值:· 0 表示成功执行FETCH语句。
· -1 表示FETCH语句失败,例如移动行指针使其超出了结果集。
· -2 表示被提取的行不存在。
由于@@FETCH_STATU是全局变量,在一个连接上的所有游标都可能影响该变量的值。
因此,在执行一条FETCH语句后,必须在对另一游标执行另一FETCH 语句之前测试该变量的值才能作出正确的判断。
下例显示如何嵌套游标以生成复杂的报表。
为每个作者声明内部游标。
SET NOCOUNT ONDECLARE @au_id varchar(11), @au_fname varchar(20), @au_lnamevarchar(40),@message varchar(80), @title varchar(80)PRINT "-------- Utah Authors report --------"DECLARE authors_cursor CURSOR FORSELECT au_id, au_fname, au_lnameFROM authorsWHERE state = "UT"ORDER BY au_idOPEN authors_cursorFETCH NEXT FROM authors_cursorINTO @au_id, @au_fname, @au_lnameWHILE @@FETCH_STATUS = 0BEGINPRINT " "SELECT @message = "----- Books by Author: " +@au_fname + " " + @au_lnamePRINT @message-- Declare an inner cursor based-- on au_id from the outer cursor.DECLARE titles_cursor CURSOR FORSELECT t.titleFROM titleauthor ta, titles tWHERE ta.title_id = t.title_id ANDta.au_id = @au_id -- Variable value from the outer cursorOPEN titles_cursorFETCH NEXT FROM titles_cursor INTO @titleIF @@FETCH_STATUS <> 0PRINT " <<No Books>>"WHILE @@FETCH_STATUS = 0BEGINSELECT @message = " " + @titlePRINT @messageFETCH NEXT FROM titles_cursor INTO @titleENDCLOSE titles_cursorDEALLOCATE titles_cursor-- Get the next author.FETCH NEXT FROM authors_cursorINTO @au_id, @au_fname, @au_lnameENDCLOSE authors_cursorDEALLOCATE authors_cursorGO2 游标使用方法:公司行政考评数据的处理CREATE PROCEDURE dbo.Toltal_jixiao@firstdata datetime,@enddata datetime,@errorMes varchar(100) outputASupdate Staff_Table set YjxkpCount=40 where not exists (select * from JiXiaoKaoHe_Score where suoshubumen=Staff_Table.Ybumen and kaoheren=Staff_Table.Ynameand kaoheRiQi=@firstdataa nd zhiwu='员工' )and yuefen=@firstdata and Yzhiwu='员工'update Staff_Table set YjxkpCount=50 where not exists (select * from JiXiaoKaoHe_Score where suoshubumen=Staff_Table.Ybumen andk aoheren=Staff_Table.Yname andk aoheRiQi=@firstdataa nd zhiwu<>'员工' )and yuefen=@firstdata and Yzhiwu<>'员工'--==================================================================== ==========================================update Staff_Table set YjxkpCount=40-ok.zf from(select p.kaoheID,(p.cdzt+p.ybyr+p.kq+p.gztd+p.qjia+p.hjws+p.jianzh+p.tdhz+p.baomi+p.gzzhze+p.caiwu+p.shhzr en+p.work_score) zf from(select kaoheID,sum(cdzt_score) as cdzt,sum(ybyr_score) as ybyr,sum(kq_score) as kq,sum(gztd_score) as gztd,sum(qjia_score) as qjia,sum(hjws_score) as hjws,sum(jianzh_score)as jianzh,sum(tdhz_score) as tdhz,sum(baomi_score) as baomi,sum(gzzhze_score) as gzzhze,sum(caiwu_score) as caiwu,sum(shhzren_score) as shhzren,sum(work_score) as work_scorefrom dbo.JiXiaoKaoHe_Score where kaoheRiQi =@firstdata group by kaoheID) p) okwhere Staff_Table.id=ok.kaoheID and Yzhiwu='员工'update Staff_Table set YjxkpCount=50-ok.zf from(select p.kaoheID,(p.cdzt+p.ybyr+p.kq+p.gztd+p.qjia+p.hjws+p.jianzh+p.tdhz+p.baomi+p.gzzhze+p.caiwu+p.shhzr en+p.work_score) zf from(select kaoheID,sum(cdzt_score) as cdzt,sum(ybyr_score) as ybyr,sum(kq_score) as kq,sum(gztd_score) as gztd,sum(qjia_score) as qjia,sum(hjws_score) as hjws,sum(jianzh_score)as jianzh,sum(tdhz_score) as tdhz,sum(baomi_score) as baomi,sum(gzzhze_score) as gzzhze,sum(caiwu_score) as caiwu,sum(shhzren_score) as shhzren,sum(work_score) as work_scorefrom dbo.JiXiaoKaoHe_Score where kaoheRiQi =@firstdata group by kaoheID) p) okwhere Staff_Table.id=ok.kaoheID and Yzhiwu<>'员工'update Staff_Table set YjxkpCount=cast(YjxkpCount asdecimal(18,1)) where yuefen=@firstdata--循环获取迟到早退次数====================================================================== =========================================================declare @i intdeclare @id1 intdeclare cur cursor forselect kaoheID, count(cdzt_score) from JiXiaoKaoHe_Score where kaoheRiQi=@firstdata and cdzt_score<>'' and zhiwu='员工' group by kaoheIDopen curfetch next from cur into @id1,@iwhile @@fetch_status =0beginselect @id1,@i-- 统计员工绩效行政考评数据if @i<6 and @i>2 --3次得beginupdate Staff_Table set YjxkpCount=20 where id=@id1update Staff_Table set YjxkpCount=20-(selectsum(ybyr_score)+sum(kq_score)+sum(gztd_score)+sum(qjia_score)+sum(hjws_score)+sum(jianz h_score)+sum(tdhz_score)+sum(baomi_score)+sum(gzzhze_score)+sum(caiwu_score)+sum(shhzren_score)+sum(work_score)from JiXiaoKaoHe_Scorewhere kaoheRiQi=@firstdata and zhiwu='员工' and kaoheID=@id1 group bykaoheID) where id=@id1--处理小数点问题update Staff_Table set YjxkpCount=cast(YjxkpCount asdecimal(18,1)) where yuefen=@firstdataend else if @i>5 --6次的begin--1、统计迟到早退次数update Staff_Table set YjxkpCount=0 where id=@id1endfetch next from cur into @id1,@iendclose cur --关闭游标deallocate cur--==================================================================== ====================================================================== =================declare @i2 intdeclare @id2 intdeclare cur cursor forselect kaoheID,count(cdzt_score) from JiXiaoKaoHe_Score where kaoheRiQi=@firstdata and cdzt_score<>'' and zhiwu<>'员工' group by kaoheIDopen curfetch next from cur into @id2, @i2while @@fetch_status =0beginselect @id2, @i2-- 统计管理层绩效行政考评数据if @i2<6 and @i2>2 --3次得begin--1、统计迟到早退次数update Staff_Table set YjxkpCount=25 where id=@id2update Staff_Table set YjxkpCount=25-(selectsum(ybyr_score)+sum(kq_score)+sum(gztd_score)+sum(qjia_score)+sum(hjws_score)+sum(jianz h_score)+sum(tdhz_score)+sum(baomi_score)+sum(gzzhze_score)+sum(caiwu_score)+sum(shhzren_score)+sum(work_score)from JiXiaoKaoHe_Scorewhere kaoheRiQi=@firstdata and zhiwu<>'员工' and kaoheID=@id2 group bykaoheID) where id=@id2update Staff_Table set YjxkpCount=cast(YjxkpCount asdecimal(18,1)) where yuefen=@firstdataend else if @i2>5 --6次的begin--1、统计迟到早退次数update Staff_Table set YjxkpCount=0 where id=@id2endfetch next from cur into @id2, @i2endclose curdeallocate cur--计算总的分值update Staff_Table set YzCount = YjxkpCount+YjxhpCount+YzgkpCount where yuefen=@firstdata--执行成功gSuccess:set @errorMes = ''return 0gFail:if @errorMes =''set @errorMes = '统计时异常错误'return -200GOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO。