以减少网络流量,还可以增强安全性。 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)永久性:事务所做的更改是永久而稳固的;