提示:编写过程当中,可需参阅联机丛书获取下列内容的具体用法sql
一、声明变量可用declare,为变量赋值用set数据库
二、须要判断可用if语句,如if内需执行多条语句,可用begin 和 end 来限定if做用的范围c#
三、可经过while循环来依次读取全部记录,读取状态可用@@FETCH_STATUS获取函数
四、如游标已建立,但执行过程当中出错。致使从新执行时提示游标已存在,可用cursor_status来检查是否存在该游标,如存在,则先deallocatefetch
declare @S# VARCHAR(16); --定义临时变量 declare @C# VARchar(8); declare @SCORE VARCHAR(4); declare mycursor cursor for --定义游标 select SC.S#,SC.C#,SC.SCORE FROM dbo.SC open mycursor; --打开游标 fetch from mycursor into @S#,@C#,@SCORE; WHILE @@FETCH_STATUS =0 --若是上一次操做成功则继续循环 BEGIN print 'S#: '+@S#+'C#:'+@C#+'SCORE:'+@SCORE fetch from mycursor into @S#,@C#,@SCORE; END 空行是由于成绩的数据位空(NULL)
在操做游标时,须要经过declare先定义几个须要的临时变量,spa
declare mycursor cursor for select SC.S#,SC.C#,SC.SCORE FROM dbo.SC 这句话是定义游标语句。3d
mycursor是游标的名字,dbo.SC是游标使用的数据库表名,SC.S#,SC.C#,SC.SCORE是SC表的属性。code
建立好游标以后须要打开游标 openblog
上面的实验代码为使用游标语句检索SC表中的S#,C#,SCORE三个属性的数据。结果以下图:get
读取过程当中删除S5的选课记录,并将为空的成绩修改成60分。
代码以下:
open mycursor; --打开游标 fetch from mycursor into @S#,@C#,@SCORE; WHILE @@FETCH_STATUS =0 --若是上一次操做成功则继续循环 BEGIN if(@SCORE is null) update SC set SCORE='60' where current of mycursor if(@S#='s5') delete from SC where current of mycursor print 'S#: '+@S#+'C#:'+@C#+'SCORE:'+@SCORE fetch from mycursor into @S#,@C#,@SCORE; END
结果以下:
declare mycursor scroll cursor for --定义游标 select SC.S#,SC.C#,SC.SCORE FROM dbo.SC order by S# DESC;
use Work go create procedure getTopResultByTbname --建立函数getTopResultByTbname @number int,@tablename varchar(4) --定义函数中number,tablename属性 as begin declare @sql varchar(50) set @sql='select top '+ cast(@number as char) + '*from' + @tablename; exec(@sql); end DROP PROCEDURE getTopResultByTbname --释放函数getTopResultByTbname exec getTopResultByTbname 3,' SC' --查询SC表前三行
go create function getRankBySnoAndCno --定义方法getRankBySnoAndCno (@s# char(16),@c# char(16)) returns int --定义方法中属性S#,C# as begin declare @ret int ,@score float if not exists (select *from sc where S#=@s# and C#=@c# ) set @ret=-1 else begin set @score =(select SCORE from sc where S#=@s# and C#=@c# ) --SQL语句 set @ret=(select count(*) from SC where C#=@c# and SCORE>@score)+1 --SQL语句 end return @ret end select dbo.getRankBySnoAndCno('s1','c1') --对SC表中的s1,c1进行检索