有关存储过程问题(2分)

  • 主题发起人 主题发起人 wl821205
  • 开始时间 开始时间
W

wl821205

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位哪里有关于存储过程的资料
 
去网上找呀,应该提出具体问题和哪方面,是那种数据库的。
 
我给你发一段
存储过程的概述:
1:什么是存储过程(store procedure):
存储过程是一组预先编译好的sql语句。存储过程可以作为独立的数据对像,也可用作为一个单元被用户的应用程序调用。由于已经是编译好的代码,所以在执行时不必再次编译从而提高了程序的运行效率。打个比方,比如你作为一个客户端要向服务器发出一个含有100行的sql语句查询代码,则服务器必须要对你的sql语句先进行语法检验,然后再编译,再处理之后把结果返回给客户,则你的100行语句则要通过网络在网线上传输,然而这样有两个缺点:
1:服务器必须要先对你的代码进行编译。
 2:有100行的代码将在网上传输,从而增加网络流量。
要解决这样的办法可以:
1:让客户还没有对服务器发出请求时,先让服务器对这些代码进行编译.
2:可以用一个简单的名字来代替这100行代码。
而存储过程就是解决这些问题的对像那是因为存储过程的特点来决定的:
A:存储过程是存储在服务器上的,并由服务器来执行的,客户端要做的仅仅是向服务器发出执行存储过程 的请求
B:存储过程在创建的时候,是先要进行编译的,所以服务器在执行存储过程时,不会再编译。
C:存储过程可以是对数据库进行查询或修改的语句。
D:存储过程与函数的区别在于:存储过程不能返回值,所以不能写上:变量名=存储过程调用,只能够单独 来调用但存储过程可以通过变量来返回值.



create proc 存储过程
as
sql语句
例如:
create proc ww
as
select * from work1 where 性别='男'

建议使用以下的方式来建立存储过程:
if exists(select name from sysobjects where name='存储过程名' and type='p')
drop
go[注意go不能掉]
create proc 存储过程名
as
sql语句

无参存储过程的使用:
exec 存储过程名

注意:存储过程书写时不必要加上begin.....end.但是存储过程用什么来决定它所含有语句呢?
比如:
create proc abc
as
select * from work where 性别='男'
update work1 set 基本工资=基本工资+100
则存储过程ab包含的语句为两条语句。
如果改成:
create proc abc
as
update work1 set 基本工资=基本工资+100
go
select * from work where 性别='男'
则存储过程包含的语句只有:一条update语句。
  说明:存储过程所包含的语句是自"as"开始,到下一个go结为止的语句。


举列:把存储过程更新职工信息按照存储过程更新职称工资来进行更新 
1:alter proc 存储过程
as
deallocate ab_king
declare ab_king cursor
for
select 职称,基本工资,补贴 from 存储过程更新职工信息
open ab_king
declare @职称 varchar(10),@基本工资 int ,@补贴 int
fetch from ab_king into @职称,@基本工资,@补贴
while @@fetch_status=0
begin
select @基本工资=基本工资,@补贴=补贴 from 存储过程更新职称工资 where 职称=@职称
update 存储过程更新职工信息 set 基本工资=@基本工资,补贴=@补贴 where current of ab_king
fetch from ab_king into @职称,@基本工资,@补贴
end

2:有一存储过程学生成绩表,通过存储过程来为某个学生确定名次

if exists(select name from sysobjects where name='存储过程成绩' and type ='P')
drop proc 存储过程成绩
go
create proc 存储过程成绩
as
update 存储过程学生成绩 set 名次=t.名次
from (select 学号,总分 ,(select count(*) from 存储过程学生成绩 b where a.总分<b.总分)+1 名次 from 存储过程学生成绩 a ) as t
where t.学号=存储过程学生成绩.学号

创建有参的存储过程:
语法:
create proc 过程名 参数列表[output]
as
sql语句
说明:
output指出该参数是一个返回调用过程的参数,在调用时不必为返回参数赋值,也可以没有返回参数
例如:
create proc sumsum @n int ,@s int output
as
declare @i int
select @i=1,@s=0
while @i<=@n
select @s=@s+@i,@i=@i+1

调用:
declare @s int
execute sumsum 20,@s output
select @s 和

说明:在使用存储过程时,如果create proc中某个变量使用了output则表示该变量为"返回参数"变量,则在使用时也必须带上output关键字

再如:
有存储过程work表和存储过程商品销售要求
利用存储过程输入一个职工号,求出的他的销售量。如果总销售量>300把相应的工资加100
代码:
crteate proc abc @bh varchar(10),@xs int output
as
select @bh 职工号,sum(销售量) as 销售总额 from 存储过程商品销售 where 职工号=@bh
select * from 存储过程work where 职工号=@bh
set @xs=(select sum(销售量) from 存储过程商品销售 where 职工号=@bh)

调用:
declare @总额 int output,@职工号 varchar(10)
set @职工号='01'
exec abc @职工号,@总额 output
if @xs>300
update 存储过程work set 基本工资=基本工资+100 where 职工号=@职工号
select * from 存储过程work where 职工号=@职工号

存储过程也可以没有output关键字,如果没有则该存储过程不再会返回结果。比如:
新建一个存储过程,要求:对指定的学历,进行指定工资的增减:
如:输入 本科 + 100则表示把学历为本科的职工的基本工资加上100

代码:

alter proc ab @xl varchar(10),@oper varchar(2),@pay int
as
select * from work1 where 学历=@xl
update work1 set 基本工资=
case @oper
when '+' then 基本工资+@pay
when '-' then 基本工资-@pay
when '*' then 基本工资*@pay
end
where 学历=@xl
select * from work1 where 学历=@xl
exec ab '大专','+',100
存储过程的补充:

1: 创建使用参数默认值的存储过程
可以在为存储过程指定参数时,如果用户不传给存储过程的参数值时,用它的默认参数:
列:
create proc 性别 @sex varchar(10)='男'
as
select * from work1 where 性别=@sex
则如果在调用时,不指定性别则自动为男

2:. 使用参数默认值 NULL 创建存储过程:
我们可以看到,上面如果不指定参数默认值,则在调用存储过程时,如果不指定参数就会出错
参数默认值可以是 NULL 值。在这种情况下,如果未提供参数,则 SQL Server 将根据存储过程 的其它语句执行存储过程。不会显示错误信息。

比如:
CREATE PROC show @xl varchar(30) = NULL
AS
IF @xl IS NULL
PRINT '没有指定学历'
ELSE
update work1 set 基本工资=基本工资+100 where 学历=@xl

3:存储过程的嵌套调用:
可以在一个存储过程里面调用另外一个存储过程。
比如:
4:有一个存储过程碟片碟片表,要求生成一个碟片数量表。

代码
create proc 类型 @type varchar(10),@qua int output ---根据类型求其数量
as
select @qua=count(*) from 存储过程碟片 where 类型=@type


create proc 碟片数量 ------创建一个表
as
create table 碟片数量出租表
(
碟片类型 varchar(10),
出租数量 int
)

alter proc 碟片游标 -----求名类型的数量
as
exec 碟片数量
declare ab_king cursor
for
select distinct 类型 from 存储过程碟片
open ab_king
declare @类型 varchar(10),@数量 int
fetch from ab_king into @类型
while @@fetch_status=0
begin
execute 类型 @类型,@数量 output
insert 碟片数量出租表 values(@类型,@数量)
fetch from ab_king into @类型
end

4:存储过程也可以通过return语句来返回值,只要遇到return 语句,则立即结束存储过程,即使它下面 还有语句,也不做[检验一下]。例如:
create proc www @sex varchar(10)
as
declare @n int
select @n=count(*) from work1 where 性别=@sex
return @n

调用时:
declare @n int
exec @n=www '男' [注意调用的格式不能这样: @n=exec www '男']
select @n
相当于:
create proc www @sex varchar(10) ,@n int output
as
declare @n int
select @n=count(*) from work1 where 性别=@sex
说明:
1:return语句并不是存储过过程必须的,而函数里面必须有reutrn语句,也就是说存储过程可以 返用return返回值,也可以不用return返回值,而通过参数来返回值
2:所以存储过程包含了函数.
3:一个存储过程里面可以有多个return语句,最先遇到那一个return语句,则从该位置处返回, 而函数只能够有一个return语句

5:执行远程存储过程:
在执行远程存储过程,必须配置链接服务器,在配置链接服务器的时候,一定要选择“rpc输出“项。然后就可以像执行其它对像一样执行存储过程

管理存储过程

1: 存储过程的查看:
格式:sp_helptext 存储过程名
2:删除存储过程: drop proc 存储过程名
说明:在删除之前可以察看一上相关性。
3: 修改存储过程: alter proc 存储过程名


6:指定在特定的时间点来执行存储过程:
使用: waitfor 函数可以实现:
格式:
A: waitfor delay 时间,延迟多少时间之后再执行:
比如:
waitfor delay '00:00:13' [延迟13秒之后]
exec 存储过程名
再如: waitor delay '00:01:00' [延迟一分钟之后]
B: waitfor time '时间' 指到指定的时间点再执行
 比如: waitfor time '22:20' 到达22:20分之后再执行
        
   比如:


本地临时存储过程与全局临时存储过程
如果我们在创建存储过程时在名字前面加上:
# 表示本地临时存储过程
## 表示全局临时存储过程

特点:
1:SQL Server 关闭后,这些过程将不再存在。
2:只有创建本地临时过程的连接才能执行该过程,当该连接关闭时,将自动删除该过程。
3:任何连接都可执行全局临时存储过程。只有创建该过程的用户所用的连接关闭,并且所有其它连接所用的该过程的当前执行版本运行完毕后,全局临时存储过程才不再存在。一旦用于创建该过程的连接关闭,将不再充许其它用户来使用该全局存储过程,但是如果在关闭以前的用户还没有使用完毕,则充许继续使用该全局存储过程
 
SQL Server幫助里面非常清楚。
 
后退
顶部