SQL - SERVER2000教程(8)

2019-01-12 13:42

以减少网络流量,还可以增强安全性。 2.存储过程的创建

create procedure 存储过程名 [参数列表] as SQL语句 3.存储过程的执行

exec procedure 参数1、参数2。。。。。。 4.修改存储过程

alter procedure 存储过程名 5.删除存储过程

drop procedure存储过程名 6.例题

学生表(学号、姓名、住址、年级) 成绩表(考号、学号、成绩) 例1、创建立不带参数的存储过程 --查询所有学生的考试成绩 create proc proc_student1 as

select 姓名,成绩 from 学生表,成绩表 where 学生表.学号=成绩表.学号 执行:EXEC proc_student1 例2、创建带输入参数的存储过程 --查询某位学生的成绩 create proc proc_student2 @stuName varchar(8) as

select姓名,成绩 from 学生表

inner join成绩表 on 学生表.学号=成绩表.学号 where 姓名=@stuName

执行:EXEC proc_student2 ?Mary? 例3、创建带输出参数的存储过程 --按照所要查找班级求出平均分 create proc proc_student3

@Year char(20),@SumCj int output as

select @SumCj=sum(成绩) from 学生表 inner join 成绩表 on 学生表.学号=成绩表.学号 where 年级=@Year 执行:declare @sumCj1 int

EXEC proc_student3 ?一年二班?,@sumCj1 output Print @sumCj1

例4、创建带返回值的存储过程

Return 语句可以带回一个值,也可带回结果集。

程序如果遇到return,那么return语句以下的所有语句将不再执行,程序 返回存储过程执行的起点。 --将所以查找的班级返回平均值 create proc proc_student4

@Year char(2) as begin

declare @avgCj int

if exists(select * from student where 年级=@Year) begin

select @avgCj=avg(成绩) from学生表 inner join成绩表 on 学生表.学号=成绩表.学号 where 年级=成绩表.学号 end else

set @avgCj=-1 return @avgCj end

第四节 游标

1. 游标概述

由于SQLServer是使用结果集来处理数据,因此当需要逐条处理表中的记录时就必须使用游标来处理。游标一般被定义和使用在服务器端,当游标

开启后,服务器为每一个游标保持一个指针,用来前后检索数据。当游标大量的使用时,服务器端的负担很重。

2. 游标的特性

A.种类:动态游标、静态游标和、键集游标和仅向前游标;

动态游标(Dynamic):可以监测对结果集的所有操作(增、删、改),前后滚动。当滚动时,动态游标反映结果集中所做的修改。

静态游标(Static):不能监测其他用户的所有操作,前后滚动。以快照形式把当前表存到Tempdb临时表中,执行指令后将结果集带给游标,

新的数据值不会显示在静态游标中。

键集游标(Keyset):可以监测用户对数据的修改,前后滚动。在Tempdb中利用主键实现对数据检索。

对于仅向前游标(Fast_only):该游标只能向前滚动。

B.功能:可设置游标结果为只读的,或可更新的;游标的移动类型等; 3 游标的状态 --声明

Declare cursor_ name Cursor for Select 语句 --打开

Open cursor_name --提取数据

Fetch next from cursor_name into 变量1,变量2 --关闭游标

Close cursor_name --释放游标 Deallocate cursor

4.例题

事例1、查询某个书店的订单的数量 --存储过程名称 StoreOrderSum

--输入参数:@StoreName varchar(30) 书店名称 --返回参数:@SumQty int 订单数量 --定义静态游标名称:SalesQty Create procedure StoreOrderSum @StoreName varchar(30) As

Declare SalesQty cursor static For select qty from sales

where stor_id= (select stor_id from stores where stor_name like @storename+'%') Open SalesQty

De4clare @Qty smallint Declare @sumqty int select @qty=0 select @sumqty=0

Fetch next from SalesQty into @Qty --游标首次打开时指针指为 Bof 必须移动到第一条记录上 While @@fetch_status=0 --游标状态函数 ,当值不为0时,游标移动指针 --可能到记录末或出现错误 Begin

Set @Sumqty=@Sumqty+@Qty --累计订单数量

Fetch next from SalesQty into @Qty --按查询结果集字段顺序依次将 --当前记录中的数据给变量赋值 End

Close Salesqty Deallocate Salesqty Return @SumQty 测试: Begin

Declare @ff int

Exec @ff=OrderNum 'Bookbeat' Print cast(@ff as varchar) End

例题2、打印每名学生的成绩,并对其评定。 --声明游标

declare cursor_stu cursor static

for select name,cj from student declare

@name varchar(8), @cj int --打开游标 open cursor_stu

--提取游标

fetch next from cursor_stu into @name ,@cj while (@@fetch_status=0) begin

if @cj<60

print @name+cast(@cj as char(8))+?不及格? else

if @cj>=60 and @cj<70

print @name+cast(@cj as char(8))+? 及格? fetch next from cursor_stu into @name,@cj end --关闭游标

close cursor_stu --释放游标

deallocate cursor_stu

事例3:将多行数据按每二行合并一行

--声明游标

declare cursor_AA cursor static for select ID,name from AA

declare @ID_A varchar(10), @NAME_A VARCHAR(10),

@ID_B varchar(10), @NAME_B VARCHAR(10), @ROWS INT, @ROW INT SET @ROW=0 --打开游标 open cursor_AA --提取游标

SET @ROWS=@@CURSOR_ROWS SELECT @ROWS while (@ROW<@ROWS) begin

fetch next from cursor_AA into @ID_A,@name_A SET @ROW=@ROW+1

fetch next from cursor_AA into @ID_B,@name_B SET @ROW=@ROW+1

INSERT INTO BB(ID_A,NAME_A,ID_B,NAME_B) VALUES(@ID_A,@NAME_A,@ID_B,@NAME_B) SET @ID_A='' SET @NAME_A='' SET @ID_B='' SET @NAME_B='' end

close cursor_AA --关闭游标 deallocate cursor_AA--释放游标

第五节 事务和锁

1. 事务概述

事务保证多个数据更改操作作为一个单位处理。 2. 事务的特性

(1)原子性:事务必须是完全成功或完全失败; (2)一致性:事务必须强制招待所有数据一致性规则。 (3)隔离性:所有修改数据的事务都必须彼此隔离开来。 (4)永久性:事务所做的更改是永久而稳固的;


SQL - SERVER2000教程(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:[最新推荐]大学生暑假兼职打工的心得体会-范文模板(3页)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: