一、存储过程
存储过程是预编译的SQL语句的集合,这些语句存储在一个名称下并作为一个单元处理。存储过程代替了传统的逐条执行sql语句的方式。一个存储过程中可包含查询、插入、更新、删除等操作的一系列sql语句。当这个存储过程被调用执行时,这些操作也会同时执行
存储过程与其他编程语言的过程类似,它可以接受输入参数,并以输出参数的格式向调用过程或批处理返回多个值;包含用于在数据库中执行操作(包括调用其他过程的)的编程语句;向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。
- 创建存储过程
create proc [EDURE] procedure_name [:number]
[{@parameter data_type}
[VARYING] [=default] [OUTPUT]
] [...n]
AS sql_statement
参数 |
描述 |
create procedure |
关键字,也可以写成create proc |
procedure_name |
创建的存储过程名字 |
number |
对存储过程进行分组 |
@parameter |
存储过程参数,存储过程可以声明一个或多个参数 |
data_type |
参数的数据类型,所有数据类型(包括text,ntext和image)均可以用作存储过程的参数,但cursor数据类型只能用于OUTPUT参数 |
VARYING |
可选项,指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化),该关键字仅适用于游标参数 |
default |
可选项,表示为参数设置默认值 |
OUTPUT |
可选项,表明参数是返回参数,可以将参数值返回给调用的过程 |
n |
表示可以定义多个参数 |
AS |
指定存储过程要执行的操作 |
sql_statement |
存储过程中的过程体 |
--存储过程查询所有数据
--begin...end 类似编程语言中的{}
create proc stu1
as
begin
select * from student;
end
go
exec stu1
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据条件用户名查询用户信息
create proc stu2
@sname varchar(50) --声明全局变量
as
begin
select * from student s where s.stuName=@sname;
end
go
exec stu2 '王男'
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程内部设定用户名查询用户信息
create proc stu3
@sname varchar(50)='王男'
as
begin
select * from student s where s.stuName=@sname;
end
go
exec stu3
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据用户名查询是否存在这个用户信息
create proc stu4
@sname varchar(50),
@result varchar(8) output --输出参数
as
begin
if (select COUNT(1) from student s where s.stuName=@sname)>0
--if exists (select COUNT(1) from student s where s.stuName=@sname)
set
@result='存在!'
else
set
@result='不存在!'
end
go
declare @result varchar(8)
exec stu4 '王男1',@result output
print @result
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程内部设定局部变量用户名来查询用户信息
create proc stu5
as
declare @sname varchar(50) --局部变量声明
set @sname='杨幂'
begin
select * from student s where s.stuName=@sname
end
go
exec stu5
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据条件用户学号查询用户名
create proc stu6
@stuNo varchar(50)
as
declare @sname varchar(50)
set @sname=(select s.stuName from student s where s.stuNo=@stuNo)
select @sname
go
exec stu6 '01'
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程插入用户信息
create proc stu7
@stuNo varchar(50),
@stuName varchar(50),
@stuAge datetime,
@stuSex varchar(5)
as
begin
insert into student
(stuNo,stuName,stuAge,stuSex)
values
(@stuNo,@stuName,@stuAge,@stuSex)
end
go
exec stu7 '07','王莽','2000-9-9 9:9:9','女'
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据用户名来删除对应的用户信息
--@@rowcount返回操作条数
--return返回信息,终止下面的操作
create proc stu8
@stuName varchar(50)
as
begin
delete from student where stuName=@stuName
return @@rowcount
end
go
declare @result varchar(50)
exec @result=stu8 '王莽'
select @result as '删除条数'
--print @result
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据用户学号来查询他的平均分
create proc stu9
@stuNo varchar(50),
@avg int output
as
begin
set @avg=(select AVG(courseScore) from course where stuNo=@stuNo)
--等同
--select @avg=AVG(courseScore) from course where stuNo=@stuNo
end
go
declare @avg int
exec stu9 '02',@avg output
print @avg
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程根据用户学号来联合查询用户信息和课程信息
create proc stu10
@stuNo varchar(50)
as
select c.stuNo,s.stuName,s.stuAge,s.stuSex,c.courseName,c.courseScore from student s join course c on s.stuNo=c.stuNo where s.stuNo=@stuNo
go
exec stu10 '02'
go
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程判断学号是否存在,不存在,插入用户信息,返回消息;存在,返回信息
create proc stu11
@stuNo varchar(50),
@stuName varchar(50),
@stuAge datetime,
@stuSex varchar(5),
@result varchar(50) output
as
if exists (select * from student where stuNo=@stuNo)
begin
set @result='对不起,学号已存在!'
end
else
begin
insert into student
(stuNo,stuName,stuAge,stuSex)
values
(@stuNo,@stuName,@stuAge,@stuSex)
set @result='恭喜你,用户信息插入成功!'
end
go
declare @result varchar(50)
exec stu11 '06','王忠磊','1980-8-8 8:9:0','男',@result output
print @result
--------------------------------------------------------------------------
--------------------------------------------------------------------------
--存储过程查询当前用户的平均成绩与总的平均成绩之间的关系
create proc stu12
@stuNo varchar(50)
as
declare @curAvg decimal(18,2)
declare @totalAvg decimal(18,2)
if exists(select * from course where stuNo=@stuNo)
begin
set @totalAvg=(select AVG(courseScore) from course)
select @curAvg=AVG(courseScore) from course where stuNo=@stuNo
print ('总的平均分:'+convert(varchar(18),@totalAvg))
print ('该生的平均分:'+convert(varchar(18),@curAvg))
if @curAvg>@totalAvg
print '高于平均水平!'
else
print '低于平均水平!'
end
else
print '该生对应的分数信息不存在,请重新查询!'
go
exec stu12 '03'
go
sqlserver存储过程学习(通俗易懂)_英雄主义-CSDN博客_sqlserver 存储过程
-
管理存储过程
-
执行存储过程
存储过程创建完成后,可以通过execute执行,简写为exec
[{exec|execute}]
{
[@return_status=]
{module_name[;number]|@modlue_name_var}
[[@parameter=]{value
|@variable[OUTPUT]
|[DEFAULT]
}
]
[...n]
[WITH RECOMPILE]
}
参数 |
描述 |
@return_status |
可选的整型变量,存储模块的返回状态。这个变量execute语句前,必须在批处理、存储过程或函数中声明过 |
module_name |
是要调用的存储过程或标量值用户定义函数的完全限定或者不完全限定的名称。模块名称必须符合标识符规则。无论服务器的排序规则如何,扩展存储过程的名称总是区分大小写 |
number |
是可选整数,用于对同名的过程分组。该参数不能用于扩展存储过程 |
@module_name_var |
是局部定义的变量名,代表模块名称 |
@parameter |
module_name的参数,与在模块中定义的相同,参数名称前必须加上“@”符号 |
value |
传递给模块或传递命令的参数值,如果参数名称没有指定,参数值必须以在模块中定义的顺序提供 |
@variable |
是用来存储参数或返回参数变量 |
OUTPUT |
指定模块或命令字符串返回一个参数,该模块或命令字符串中的匹配参数也必须使用关键字OUTPUT创建。使用游标变量作为参数时使用该关键字 |
DEFAULT |
根据模块的定义,提供参数的默认值。当模块需要的参数值没有定义默认值并且缺少参数或指定了DEFAULT关键字,会出现错误 |
WITH RECOMPILE |
指定模块后,强制编译、使用和放弃新计划。如果该模块存在现有查询计划,则该计划将保留在缓存中 |
-
查看存储过程
-
使用sys.sql_modules查看存储过程的定义
select * from sys.sql_modules
- 使用OBJECT_DEFINITION查看存储过程的定义
-- object_id 要查看的存储过程id
select OBJECT_DEFINITION(object_id)
- 使用sp_helptext查看存储过程的定义
sp_helptext 'proc_student'