在Sql Server存储过程中使用Cursor(游标)操作记录

合集下载

数据库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游标的使用和解析

cursor for游标的使用和解析
游标是一种在数据库中进行数据操作的工具,它可以让我们在查询结果集中逐行移动,并且可以对每一行的数据进行操作和解析。

游标通常用于需要对大量数据进行处理或分析的情况下,它可以提高操作的效率和灵活性。

在使用游标之前,我们首先需要声明一个游标变量,并且定义游标的类型、查询语句和游标属性等。

可以使用DECLARE语句来声明游标,并且可以选择性地指定游标的属性,例如是否允许滚动、是否允许更新等。

接下来,我们可以使用OPEN语句来打开游标,该语句会执行查询语句,并将结果集保存到游标中。

一旦游标被打开,我们可以使用FETCH语句来逐行获取游标中的数据。

FETCH语句可以指定从游标中获取的行数,也可以使用循环来逐行获取所有数据。

在处理完游标中的数据后,我们可以使用CLOSE语句来关闭游标,并释放相关的资源。

在关闭游标之前,我们还可以使用UPDATE或DELETE语句来更新或删除游标中的数据。

同时,我们还可以通过检查游标的状态来判断游标是否打开,以避免重复打开或关闭游标。

需要注意的是,在使用游标时要避免对大量数据进行频繁的单行操作,因为这样会造成较大的性能开销。

可以考虑使用批量操作或临时表来优化处理过程。

总之,游标是一种强大的工具,可以帮助我们在数据库中进行复杂的数据处理和解析。

使用游标需要注意合理设置游标属性,并避免频繁的单行操作,以提高处理效率。

存储过程cursor用法

存储过程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游标详解

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写一个简单的循环

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用法在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)详细说明及内部循环使用示例

SQL游标(cursor)详细说明及内部循环使⽤⽰例游标 游标(cursor)是系统为⽤户开设的⼀个数据缓冲区,存放SQL语句的执⾏结果。

每个游标区都有⼀个名字,⽤户可以⽤SQL语句逐⼀从游标中获取记录,并赋给主变量,交由主语⾔进⼀步处理。

游标是处理结果集的⼀种机制吧,它可以定位到结果集中的某⼀⾏,多数据进⾏读写,也可以移动游标定位到你所需要的⾏中进⾏操作数据。

⼀般复杂的存储过程,都会有游标的出现,他的⽤处主要有:1. 定位到结果集中的某⼀⾏。

2. 对当前位置的数据进⾏读写。

3. 可以对结果集中的数据单独操作,⽽不是整⾏执⾏相同的操作。

4. 是⾯向集合的数据库管理系统和⾯向⾏的程序设计之间的桥梁。

优点 在数据库中,游标是⼀个⼗分重要的概念。

游标提供了⼀种对从表中检索出的数据进⾏操作的灵活⼿段,就本质⽽⾔,游标实际上是⼀种能从包括多条数据记录的结果集中每次提取⼀条记录的机制。

游标总是与⼀条SQL 查询语句相关联因为游标由结果集(可以是零条、⼀条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。

当决定对结果集进⾏处理时,必须声明⼀个指向该结果集的游标。

如果曾经⽤C 语⾔写过对⽂件进⾏处理的程序,那么游标就像您打开⽂件所得到的⽂件句柄⼀样,只要⽂件打开成功,该⽂件句柄就可代表该⽂件。

对于游标⽽⾔,其道理是相同的。

可见游标能够实现按与传统程序读取平⾯⽂件类似的⽅式处理来⾃基础表的结果集,从⽽把表中数据以平⾯⽂件的形式呈现给程序。

我们知道关系数据库管理系统实质是⾯向集合的,在MS SQL SERVER 中并没有⼀种描述表中单⼀记录的表达形式,除⾮使⽤where ⼦句来限制只有⼀条记录被选中。

因此我们必须借助于游标来进⾏⾯向单条记录的数据处理。

由此可见,游标允许应⽤程序对查询语句select 返回的⾏结果集中每⼀⾏进⾏相同或不同的操作,⽽不是⼀次对整个结果集进⾏同⼀种操作;它还提供对基于游标位置⽽对表中数据进⾏删除或更新的能⼒;⽽且,正是游标把作为⾯向集合的数据库管理系统和⾯向⾏的程序设计两者联系起来,使两个数据处理⽅式能够进⾏沟通。

sqlserver中的循环遍历(普通循环和游标循环)

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 游标的使用例子

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的用法

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,然后根据不同的号段输出当前系统中该号短对应的可用手机号码。

SQL工作笔记-达梦7存储过程中游标的使用(for循环IF等)

SQL工作笔记-达梦7存储过程中游标的使用(for循环IF等)

SQL⼯作笔记-达梦7存储过程中游标的使⽤(for循环IF等)表如下:如下存储过程使⽤游标遍历所有数据:CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT)ASmyId int;myName varchar(50);cursor myCursor is select id, name from cfftest.student;BEGINopen myCursor;loopfetch myCursor into myId, myName;exit when myCursor%notfound;print 'id: ' || myId || ' name' || myName;end loop;close myCursor;END;运⾏截图如下:如果需要添加⼀个返回的结果集添加如下即可:Select ‘ok’;CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT) ASmyId int;myName varchar(50);cursor myCursor is select id, name from cfftest.student;BEGINopen myCursor;loopfetch myCursor into myId, myName;exit when myCursor%notfound;print 'id: ' || myId || ' name' || myName;end loop;close myCursor;select 'ok';END;运⾏截图如下:使⽤for循环进⾏遍历,运⾏截图如下源码如下:CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT)ASBEGINfor recordOne in (select id, name from cfftest.student) loopprint recordOne.id || ' ' || ;end loop;select 'ok';END;⼀般获取单条数据可以这样做:运⾏截图如下:源码如下:CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT)ASmyname varchar(50);BEGINselect name into myname from cfftest.student where id="id";print 'name is ' || myname;END;这⾥还可以增加if等功能源码如下:CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT)ASmyCount int;BEGINselect count(*) into myCount from cfftest.student where id="id";if myCount > 0 thenselect '存在数据';elseselect '不存中数据';end if;END;。

SQLServer中用While循环替代游标(Cursor)的解决方案

SQLServer中用While循环替代游标(Cursor)的解决方案

SQLServer中⽤While循环替代游标(Cursor)的解决⽅案By⾏处理数据,推荐2种⽅式:1、游标2、While循环我们来了解下这两种⽅案处理1w⾏数据分别需要多长时间。

⼀、游标。

⾸先我们填充⼀个表,⽤优雅的递归⽅式填充。

create table Orders(OrderID int,CostValue decimal(18,2) );with cte_tempas(select1as OrderIDunion allselect OrderID+1from cte_temp where OrderID<10000)insert into Orders(OrderID)select OrderID from cte_temp option (maxrecursion 32767);现在我们的订单表Orders有了⼀万条订单,但是CostValue还是NULL值。

我们⽤游标的⽅式给每⼀条订单添加⼀个CostValue,耗时44s。

--游标DECLARE@OrderID intDECLARE cursor_CostValue CURSOR FOR SELECT OrderID FROM OrdersOPEN cursor_CostValueFETCH NEXT FROM cursor_CostValue INTO@OrderIDWHILE@@FETCH_STATUS=0BEGINUPDATE Orders SET CostValue = OrderID+100WHERE OrderID =@OrderIDFETCH NEXT FROM cursor_CostValue INTO@OrderIDENDCLOSE cursor_CostValueDEALLOCATE cursor_CostValue⼆、While循环将数据放在临时表中,然后操作临时表,最后更新回总表。

耗时16s。

DECLARE@RowID int-- 获取待处理的数据记录到临时表-- 字段说明:RowID:记录⾏号 / DealFlg:⾏处理标识SELECT RowID =IDENTITY(INT , 1, 1),DealFlg=0,OrderID,CostValue =0INTO #TmpFROM OrdersSELECT@RowID=MIN(RowID) FROM #Tmp WHERE DealFlg =0-- 若最⼩⾏号不为空(有需要处理的数据)WHILE@RowID IS NOT NULLBEGINUPDATE #Tmp SET DealFlg =1,CostValue=OrderID+100WHERE RowID =@RowIDSELECT@RowID=MIN(RowID) FROM #Tmp WHERE DealFlg =0ENDupdate O set O.CostValue=T.CostValuefrom Orders Oinner join #Tmp T on O.OrderID=T.OrderID还有⼀种错误的While循环,即不把数据放在临时表中,直接操作本表,会⼤⼤增加耗时。

sqlserver cursor的用法

sqlserver cursor的用法

sqlserver cursor的用法SQL Server Cursor的用法SQL Server Cursor是一种用于遍历和处理查询结果集的工具。

在某些情况下,使用Cursor可以更方便地处理数据,但是需要注意它可能会影响性能。

1. 创建Cursor使用DECLARE CURSOR语句创建Cursor,语法如下:DECLARE cursor_name CURSORFOR select_statement[FOR {READ ONLY | UPDATE [OF column_name [,...n]]} ] [SCROLL {STATIC | KEYSET | DYNAMIC | FAST_FORWARD | FORWARD_ONLY}][FORWARD_ONLY][LOCAL | GLOBAL][FAST_FORWARD][TYPE_WARNING]其中,cursor_name是Cursor的名称,select_statement是查询语句。

SCROLL选项定义Cursor的滚动方式,包括STATIC(静态),KEYSET(键集),DYNAMIC(动态),FAST_FORWARD(快进)和FORWARD_ONLY(仅向前)。

LOCAL和GLOBAL选项定义Cursor的作用域。

FAST_FORWARD选项表示只能向前滚动。

TYPE_WARNING选项表示在转换数据类型时发出警告。

2. 打开Cursor使用OPEN语句打开Cursor:OPEN cursor_name;3. 获取数据使用FETCH语句从Cursor中获取数据:FETCH NEXT FROM cursor_name INTO @variable1,@variable2, ...;其中,@variable1、@variable2等是变量名,用于存储返回的数据。

FETCH NEXT表示获取下一行数据。

4. 处理数据可以在循环中处理每行返回的数据:WHILE @@FETCH_STATUS = 0BEGIN-- 处理数据FETCH NEXT FROM cursor_name INTO @variable1,@variable2, ...;END在循环中使用@@FETCH_STATUS变量来检查是否还有数据可用。

sql server 存储过程中 调用存储过程 返回的表

sql server 存储过程中 调用存储过程 返回的表

sql server 存储过程中调用存储过程返回的表在 SQL Server 中,存储过程可以返回结果集,这是通过使用游标 (cursor) 或临时表实现的。

如果你想从一个存储过程中调用另一个存储过程并获取其返回的结果集,可以按照以下步骤进行:定义存储过程返回结果集:首先,确保被调用的存储过程返回一个结果集。

这通常是通过使用 SELECT 语句在存储过程中返回数据。

使用游标:在调用存储过程的存储过程中,可以使用游标来遍历返回的结果集。

以下是一个简单的示例:sqlCREATE PROCEDURE sp_GetResultsFromStoredProc ASBEGIN-- 声明游标DECLARE @cursor CURSOR;-- 打开游标,执行存储过程并填充游标OPEN @cursorFROMEXEC sp_YourStoredProcedure;-- 遍历结果集FETCH NEXT FROM @cursor INTO @YourVariable;WHILE @@FETCH_STATUS = 0BEGIN-- 处理每一行数据-- ...-- 获取下一行数据FETCH NEXT FROM @cursor INTO@YourVariable;END;-- 关闭游标CLOSE @cursor;DEALLOCATE @cursor;END;使用临时表:另一种方法是使用临时表来存储返回的结果集,然后在主存储过程中查询这个临时表。

以下是一个示例:返回结果的存储过程:sqlCREATE PROCEDURE sp_YourStoredProcedureASBEGIN-- 定义临时表来存储结果集DECLARE @TempTable TABLE (YourColumns);-- 将结果插入临时表INSERT INTO @TempTable (YourColumns)SELECT YourColumns FROM YourTable WHERE YourConditions;-- 返回结果集(如果需要)或直接从临时表查询数据。

SQLServer 游标简介与使用说明

SQLServer 游标简介与使用说明

SQLServer 游标简介与使用说明游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。

我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

1.游标的组成游标包含两个部分:一个是游标结果集、一个是游标位置。

游标结果集:定义该游标得SELECT语句返回的行的集合。

游标位置:指向这个结果集某一行的当前指针。

2.游标的分类游标共有3类:API服务器游标、Transaction-SQL游标和API客户端游标。

其中前两种游标都是运行在服务器上的,所以又叫做服务器游标。

API服务器游标API服务器游标主要应用在服务上,当客户端的应用程序调用API游标函数时,服务器会对API函数进行处理。

使用API函数和方法可以实现如下功能:(1)打开一个连接。

(2)设置定义游标特征的特性或属性,API自动将游标影射到每个结果集。

(3)执行一个或多个Transaction-SQL语句。

(4)使用API函数或方法提取结果集中的行。

API服务器游标包含以下四种:静态游标、动态游标、只进游标、键集驱动游标(Primary key)静态游标的完整结果集将打开游标时建立的结果集存储在临时表中,(静态游标始终是只读的)。

静态游标具有以下特点:总是按照打开游标时的原样显示结果集;不反映数据库中作的任何修改,也不反映对结果集行的列值所作的更改;不显示打开游标后在数据库中新插入的行;组成结果集的行被其他用户更新,新的数据值不会显示在静态游标中;但是静态游标会显示打开游标以后从数据库中删除的行。

动态游标与静态游标相反,当滚动游标时动态游标反映结果集中的所有更改。

结果集中的行数据值、顺序和成员每次提取时都会改变。

只进游标不支持滚动,它只支持游标从头到尾顺序提取数据行。

注意:只进游标也反映对结果集所做的所有更改。

键集驱动游标同时具有静态游标和动态游标的特点。

declare rmcursor cursor for select

declare rmcursor cursor for select

declare rmcursor cursor for select如何在SQL Server中声明和使用游标(Cursor)?在SQL Server数据库管理系统中,游标(Cursor)允许我们以逐行的方式遍历查询结果集。

使用游标可以对每一行应用特定的操作,使我们能够逐步处理结果集。

本文将介绍如何在SQL Server中声明和使用游标。

在SQL Server中,要使用游标,我们首先需要声明一个游标变量。

声明游标的语法如下:DECLARE cursor_name CURSORFORselect_statement;其中,cursor_name是游标的名称,应根据实际情况进行命名,select_statement是查询语句,用于定义游标的结果集。

下面是一个实际的例子,展示了如何声明一个游标:DECLARE rmcursor CURSORFORSELECT *FROM employees;在上述示例中,我们声明了一个名为rmcursor的游标,它用于遍历employees表中的所有行。

接下来,我们需要打开游标并将结果集绑定到游标中。

打开游标的语法如下:OPEN cursor_name;使用OPEN语句打开游标后,游标将获得查询结果集的访问权限。

例如,我们可以使用以下代码打开先前声明的rmcursor游标:OPEN rmcursor;在打开游标后,我们可以使用FETCH NEXT语句按行检索数据。

FETCH NEXT语句的语法如下:FETCH NEXT FROM cursor_name INTO variable_list;其中,cursor_name是游标的名称,variable_list是一个变量列表,用于接收查询结果中的值。

以下是FETCH NEXT语句的一个示例:FETCH NEXT FROM rmcursorINTO employee_id, first_name, last_name;在上述示例中,我们从rmcursor游标中检索出一个employee_id、first_name和last_name,并将其分别存储在employee_id、first_name 和last_name变量中。

SQL中游标(cursor)的基本使用实例

SQL中游标(cursor)的基本使用实例

SQL中游标(cursor)的基本使⽤实例⽬录类型:1.普通游标2.滚动游标具体FETCH⽤法:Arguments总结类型: 1.普通游标只有NEXT操作 2.滚动游标有多种操作1.普通游标DECLARE @username varchar(20),@UserId varchar(100)DECLARE cursor_name CURSOR FOR --定义游标SELECT TOP 10 UserId,UserName FROM UserInfoORDER BY UserId DESCOPEN cursor_name --打开游标FETCH NEXT FROM cursor_name INTO @UserId,@username --抓取下⼀⾏游标数据WHILE @@FETCH_STATUS = 0BEGINPRINT '⽤户ID:'+@UserId+' '+'⽤户名:'+@usernameFETCH NEXT FROM cursor_name INTO @UserId,@usernameENDCLOSE cursor_name --关闭游标DEALLOCATE cursor_name --释放游标结果:⽤户ID:zhizhi ⽤户名:邓鸿芝⽤户ID:yuyu ⽤户名:魏⾬⽤户ID:yujie ⽤户名:李⽟杰⽤户ID:yuanyuan ⽤户名:王梦缘⽤户ID:YOUYOU ⽤户名:lisi⽤户ID:yiyiren ⽤户名:任毅⽤户ID:yanbo ⽤户名:王艳波⽤户ID:xuxu ⽤户名:陈佳绪⽤户ID:xiangxiang ⽤户名:李庆祥⽤户ID:wenwen ⽤户名:魏⽂⽂2.滚动游标--带SCROLL选项的游标SET NOCOUNT ONDECLARE C SCROLL CURSOR FOR --SCORLL 后,有了更多的游标操作(滚动游标)SELECT TOP 10 UserId,UserName FROM UserInfoORDER BY UserId DESCOPEN CFETCH LAST FROM C --最后⼀⾏的数据,并将当前⾏为指定⾏FETCH ABSOLUTE 4 FROM C --从第⼀⾏开始的第4⾏数据,并将当前⾏为指定⾏这⾥的n可正可负,n>0 往下翻,n<0 往上翻FETCH RELATIVE 3 FROM C --相对于当前⾏的后3⾏数据,并将当前⾏为指定⾏这⾥的n可正可负FETCH RELATIVE -2 FROM C --相对于当前⾏的前2⾏数据,并将当前⾏为指定⾏FETCH PRIOR FROM C ----相对于当前⾏的前1⾏数据FETCH FIRST FROM C --刚开始第⼀⾏的数据,并将当前⾏为指定⾏FETCH NEXT FROM C --相对于当前⾏的后1⾏数据CLOSE CDEALLOCATE C结果(可以参考第⼀个结果分析):具体FETCH⽤法:FETCH[ [ NEXT | PRIOR | FIRST | LAST| ABSOLUTE { n | @nvar }| RELATIVE { n | @nvar }]FROM]{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }[ INTO @variable_name [ ,...n ] ]ArgumentsNEXTReturns the result row immediately following the current row and increments the current row to the row returned. If FETCH NEXT is the first fetch against a cursor, it returns the first row in the result set. NEXT is the default cursor fetch option.PRIORReturns the result row immediately preceding the current row, and decrements the current row to the row returned. If FETCH PRIOR is the first fetch against a cursor, no row is returned and the cursor is left positioned before the first row.FIRSTReturns the first row in the cursor and makes it the current row.LASTReturns the last row in the cursor and makes it the current row.ABSOLUTE { n| @nvar}If n or @nvar is positive, returns the row n rows from the front of the cursor and makes the returned row the new current row. If n or @nvar is negative, returns the row n rows before the end of the cursor and makes the returned row the new current row. If n or @nvar is 0, no rows are returned. n must be an integer constant and @nvar must be smallint, tinyint, or int.RELATIVE { n| @nvar}If n or @nvar is positive, returns the row n rows beyond the current row and makes the returned row the new current row. If n or @nvar is negative, returns the row n rows prior to the current row and makes the returned row the new current row. If n or @nvar is 0, returns the current row. If FETCH RELATIVE is specified with n or @nvar set to negative numbers or 0 on the first fetch done against a cursor, no rows are returned. n must be an integer constant and @nvar must be smallint, tinyint, or int. GLOBALSpecifies that cursor_name refers to a global cursor.cursor_nameIs the name of the open cursor from which the fetch should be made. If both a global and a local cursor exist withcursor_name as their name, cursor_name to the global cursor if GLOBAL is specified and to the local cursor if GLOBAL is not specified.@cursor_variable_nameIs the name of a cursor variable referencing the open cursor from which the fetch should be made.INTO @variable_name[ ,...n]Allows data from the columns of a fetch to be placed into local variables. Each variable in the list, from left to right, is associated with the corresponding column in the cursor result set. The data type of each variable must either match or be a supported implicit conversion of the data type of the corresponding result set column. The number of variables must match the number of columns in the cursor select list.总结到此这篇关于SQL中游标(cursor)基本使⽤的⽂章就介绍到这了,更多相关SQL游标的使⽤内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

sqlserver cursor游标用法

sqlserver cursor游标用法

sqlserver cursor游标用法在SQL Server 中,游标(Cursor)是一种用于遍历结果集的数据库对象。

游标通常用于在存储过程或触发器中对查询结果进行逐行处理。

以下是SQL Server 中使用游标的一般步骤:1. 声明游标:使用`DECLARE` 语句声明游标,并指定查询语句。

```sqlDECLARE cursor_name CURSOR FORSELECT column1, column2FROM your_tableWHERE your_condition;```2. 打开游标:使用`OPEN` 语句打开游标,将查询的结果集放入游标中。

```sqlOPEN cursor_name;```3. 获取下一行数据:使用`FETCH` 语句获取游标的下一行数据。

```sqlFETCH NEXT FROM cursor_name INTO @variable1, @variable2;```4. 循环处理:使用`WHILE` 循环来处理游标中的每一行数据。

```sqlWHILE @@FETCH_STATUS = 0BEGIN--在这里处理每一行数据-- ...--获取下一行数据FETCH NEXT FROM cursor_name INTO @variable1, @variable2;END;```5. 关闭和释放游标:在处理完毕后,使用`CLOSE` 和`DEALLOCATE` 语句关闭和释放游标。

```sqlCLOSE cursor_name;DEALLOCATE cursor_name;```下面是一个完整的示例,演示如何使用游标在SQL Server 中逐行处理查询结果:```sql--创建一个存储过程CREATE PROCEDURE ProcessDataASBEGIN--声明游标DECLARE myCursor CURSOR FORSELECT EmployeeID, FirstName, LastNameFROM Employees;--打开游标OPEN myCursor;--声明变量来存储获取的数据DECLARE @EmployeeID INT, @FirstName NVARCHAR(50), @LastName NVARCHAR(50);--获取第一行数据FETCH NEXT FROM myCursor INTO @EmployeeID, @FirstName, @LastName;--循环处理每一行数据WHILE @@FETCH_STATUS = 0BEGIN--在这里处理每一行数据PRINT 'EmployeeID: ' + CAST(@EmployeeID AS NVARCHAR(10)) +', FirstName: ' + @FirstName +', LastName: ' + @LastName;--获取下一行数据FETCH NEXT FROM myCursor INTO @EmployeeID, @FirstName, @LastName;END;--关闭和释放游标CLOSE myCursor;DEALLOCATE myCursor;END;```这个示例创建了一个存储过程`ProcessData`,其中声明了一个游标,然后逐行处理`Employees` 表中的数据。

sqlserver 游标的用法

sqlserver 游标的用法

sqlserver 游标的用法游标(Cursor)是SQL Server中一种用于逐行处理查询结果集的机制。

游标可以将结果集分解为小的数据行集,使得我们能够以逐行方式处理数据。

游标通常用于需要逐行处理数据或者需要对结果集进行反向遍历的情况。

使用游标的基本语法如下:1.声明游标:```DECLARE cursor_name CURSORFORSELECT column_name(s)FROM tableWHERE condition;```其中cursor_name是游标的名称,可以自定义;SELECT语句用于定义游标的结果集。

2.打开游标:```OPEN cursor_name;```打开游标以后,就可以使用FETCH语句来获取结果集中的数据行。

3.获取数据行:```FETCH NEXT FROM cursor_name INTO variable_name;```FETCH语句用于获取游标当前指向的数据行,并将其存储到variable_name变量中。

4.处理数据行:```--对获取的数据行进行处理--更新或删除数据行UPDATE tableSET column_name = new_valueWHERE current_of cursor_name;--向数据行插入新数据INSERT INTO table(column_name)VALUES(new_value);```根据需要,我们可以对获取的数据行进行处理,可以进行数据更新、删除或插入等操作。

5.关闭游标:```CLOSE cursor_name;```关闭游标后,就无法再使用FETCH语句获取结果集的数据行。

6.释放游标:```DEALLOCATE cursor_name;```释放游标以后,游标的定义将不再有效。

游标的使用可以提供一种灵活的方式来处理查询结果集,但同时也可能带来一些性能问题。

游标的使用应该尽量避免在大型查询中使用,以免对数据库性能造成较大的影响。

SAPHANA存储过程中的游标使用(Cursor)

SAPHANA存储过程中的游标使用(Cursor)
SELECT isbn, title, price, crcy FROM books WHERE isbn = :v_isbn ORDER BY isbn; BEGIN init_proc();
IF c_cursor1%ISOPEN THEN ins_msg_proc('WRONG: cursor open');
DROP PROCEDURE foreach_proc; CREATE PROCEDURE foreach_proc() LANGUAGE SQLSCRIPT AS
v_isbn VARCHAR(20) := ''; CURSOR c_cursor1 (v_isbn VARCHAR(20)) FOR
SELECT isbn, title, price, crcy FROM books ORDER BY isbn; -- (see Bug 9197) WHERE isbn = :v_isbn BEGIN init_proc(); FOR cur_row as c_cursor1('978-3-86894-012-1') DO ins_msg_proc('book title is: ' || cur_row.title); END FOR; END;
call foreach_proc(); select message from message_box;
ins_msg_proc(:v_title || ' identified by isbn ' || :v_isbn || ' costs ' || :v_price || ' ' || :v_crcy);
FETCH c_cursor1 INTO v_isbn, v_title, v_price, v_crcy; IF c_cursor1%NOTFOUND THEN
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档