存储过程是预编译的SQL语句的集合,这些语句存储在一个名称下并做为一个单元处理。存储过程代替了传统的逐条执行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查看存储过程的定义sqlserver
select * from sys.sql_modules
-- object_id 要查看的存储过程id select OBJECT_DEFINITION(object_id)
sp_helptext 'proc_student'