网上有个比较通俗易懂的理解:存储过程就是预先定义好的SQL语句,然后存储起来,等你用的时候再把自己所需要的匹配的SQL语句用Execute(即exec)调用就行!
使用存储过程的优势:
1.性能高:一条SQL语句可以被多个地方使用,这样进行复杂的操作时(比如多张表连表查询)可将那些复杂的操作用存储过程先封装起来然后进行查询!
2.高速并减少网络流量:只在创造时进行编译,以后每次执行都不需要重新编译,这与一般的SQL语句(一般的SQL语句每执行一次就编译一次)相比就速度加快了很多!
3.安全:可以指定只有某用户才可以进行访问!
创建存储过程:CREATE PROCEDURE 存储过程名形参表AS 存储过程体
执行存储过程:EXECUTE 存储过程名 实参表
删除存储过程:DROP PROCEDURE 存储过程名
create table student1(/*创建表student1*/
Sid int identity(1,1),/*自增1*/
Sno varchar(50) primary key,/*主键*/
Sname varchar(50),
Sage int,
Ssex varchar(5)
)
运行结果如下:
/*无参数存储过程之查询所有数据*/
create proc stu1
as
begin /*与end成对出现,也可以成对省略不写*/
select * from student1
end
go
exec stu1/*执行语句查询*/
/*有参数的存数过程*/
create proc stu2
@Sname varchar(150) /*声明全局变量*/
as
select *from student1 where student1.Sname=@Sname
go
exec stu2 '王刚' /*调用stu2 这个存储过程并执行*/
go
/*有参数的存数过程之内部设定用户名查询用户信息*/
create proc stu3
@Sname varchar(50)='李泽'/*声明全局变量并赋值即内部设置默认值*/
as
select * from student1 where Sname=@Sname
-- select * from student1 where student1.Sname=@Sname
go
exec stu3
drop proc stu3/*删除存储过程stu3*/
/*局部变量*/
create proc stu4
as
declare @Sname varchar(50)/*声明局部变量*/
set @Sname ='张明'
select * from student1 where Sname=@Sname
go
exec stu4
/*存储过程根据条件用户学号查询用户年龄 */
create proc stu5
@Sno varchar(50)
as
declare @Sage varchar(50)
set @Sage=(select Sage from student1 where Sno=@Sno)
--set @Sage=(select Sage from student1 s where s.Sno=@Sno)
select @Sage
go
exec stu5 '06'
/*新增用户信息*/
create proc stu6
@Sno varchar(50),
@Sname varchar(50),
@Sage int,
@Ssex varchar(5)
as
begin
insert into student1
(Sno,Sname,Sage,Ssex)
values
(@Sno,@Sname,@Sage,@Ssex)
end
go
exec stu6 '07','陈浩','26','男'
go
/*存储过程根条件(此例是学号)查询用户存在性*/
create proc stu7
@sno varchar(50),
@result varchar(8) output --输出参数
as
begin
if (select COUNT(1) from student1 where Sno=@sno)>0
-- if exists (select Sno from student1 s where s.Sno=@Sno)
set
@result='存在!'
else
set
@result='不存在!'
end
go
declare @result varchar(8)
exec stu7'09',@result output
print @result
Go
结果:不存在