经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL SERVER 存储过程
来源:cnblogs  作者:阿斯蒂芬芬蒂斯阿  时间:2021/3/1 12:02:59  对本文有异议

一、存储过程

存储过程是预编译的SQL语句的集合,这些语句存储在一个名称下并作为一个单元处理。存储过程代替了传统的逐条执行sql语句的方式。一个存储过程中可包含查询、插入、更新、删除等操作的一系列sql语句。当这个存储过程被调用执行时,这些操作也会同时执行

存储过程与其他编程语言的过程类似,它可以接受输入参数,并以输出参数的格式向调用过程或批处理返回多个值;包含用于在数据库中执行操作(包括调用其他过程的)的编程语句;向调用过程或批处理返回状态值,以指明成功或失败(以及失败的原因)。

  1. 创建存储过程
  1. create proc [EDURE] procedure_name [:number]
  2. [{@parameter data_type}
  3. [VARYING] [=default] [OUTPUT]
  4. ] [...n]
  5. 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 存储过程中的过程体
  1. --存储过程查询所有数据
  2. --begin...end 类似编程语言中的{}
  3. create proc stu1
  4. as
  5. begin
  6. select * from student;
  7. end
  8. go
  9. exec stu1
  10. go
  11. --------------------------------------------------------------------------
  12. --------------------------------------------------------------------------
  13. --存储过程根据条件用户名查询用户信息
  14. create proc stu2
  15. @sname varchar(50) --声明全局变量
  16. as
  17. begin
  18. select * from student s where s.stuName=@sname;
  19. end
  20. go
  21. exec stu2 '王男'
  22. go
  23. --------------------------------------------------------------------------
  24. --------------------------------------------------------------------------
  25. --存储过程内部设定用户名查询用户信息
  26. create proc stu3
  27. @sname varchar(50)='王男'
  28. as
  29. begin
  30. select * from student s where s.stuName=@sname;
  31. end
  32. go
  33. exec stu3
  34. go
  35. --------------------------------------------------------------------------
  36. --------------------------------------------------------------------------
  37. --存储过程根据用户名查询是否存在这个用户信息
  38. create proc stu4
  39. @sname varchar(50),
  40. @result varchar(8) output --输出参数
  41. as
  42. begin
  43. if (select COUNT(1) from student s where s.stuName=@sname)>0
  44. --if exists (select COUNT(1) from student s where s.stuName=@sname)
  45. set
  46. @result='存在!'
  47. else
  48. set
  49. @result='不存在!'
  50. end
  51. go
  52. declare @result varchar(8)
  53. exec stu4 '王男1',@result output
  54. print @result
  55. go
  56. --------------------------------------------------------------------------
  57. --------------------------------------------------------------------------
  58. --存储过程内部设定局部变量用户名来查询用户信息
  59. create proc stu5
  60. as
  61. declare @sname varchar(50) --局部变量声明
  62. set @sname='杨幂'
  63. begin
  64. select * from student s where s.stuName=@sname
  65. end
  66. go
  67. exec stu5
  68. go
  69. --------------------------------------------------------------------------
  70. --------------------------------------------------------------------------
  71. --存储过程根据条件用户学号查询用户名
  72. create proc stu6
  73. @stuNo varchar(50)
  74. as
  75. declare @sname varchar(50)
  76. set @sname=(select s.stuName from student s where s.stuNo=@stuNo)
  77. select @sname
  78. go
  79. exec stu6 '01'
  80. go
  81. --------------------------------------------------------------------------
  82. --------------------------------------------------------------------------
  83. --存储过程插入用户信息
  84. create proc stu7
  85. @stuNo varchar(50),
  86. @stuName varchar(50),
  87. @stuAge datetime,
  88. @stuSex varchar(5)
  89. as
  90. begin
  91. insert into student
  92. (stuNo,stuName,stuAge,stuSex)
  93. values
  94. (@stuNo,@stuName,@stuAge,@stuSex)
  95. end
  96. go
  97. exec stu7 '07','王莽','2000-9-9 9:9:9','女'
  98. go
  99. --------------------------------------------------------------------------
  100. --------------------------------------------------------------------------
  101. --存储过程根据用户名来删除对应的用户信息
  102. --@@rowcount返回操作条数
  103. --return返回信息,终止下面的操作
  104. create proc stu8
  105. @stuName varchar(50)
  106. as
  107. begin
  108. delete from student where stuName=@stuName
  109. return @@rowcount
  110. end
  111. go
  112. declare @result varchar(50)
  113. exec @result=stu8 '王莽'
  114. select @result as '删除条数'
  115. --print @result
  116. go
  117. --------------------------------------------------------------------------
  118. --------------------------------------------------------------------------
  119. --存储过程根据用户学号来查询他的平均分
  120. create proc stu9
  121. @stuNo varchar(50),
  122. @avg int output
  123. as
  124. begin
  125. set @avg=(select AVG(courseScore) from course where stuNo=@stuNo)
  126. --等同
  127. --select @avg=AVG(courseScore) from course where stuNo=@stuNo
  128. end
  129. go
  130. declare @avg int
  131. exec stu9 '02',@avg output
  132. print @avg
  133. go
  134. --------------------------------------------------------------------------
  135. --------------------------------------------------------------------------
  136. --存储过程根据用户学号来联合查询用户信息和课程信息
  137. create proc stu10
  138. @stuNo varchar(50)
  139. as
  140. 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
  141. go
  142. exec stu10 '02'
  143. go
  144. --------------------------------------------------------------------------
  145. --------------------------------------------------------------------------
  146. --存储过程判断学号是否存在,不存在,插入用户信息,返回消息;存在,返回信息
  147. create proc stu11
  148. @stuNo varchar(50),
  149. @stuName varchar(50),
  150. @stuAge datetime,
  151. @stuSex varchar(5),
  152. @result varchar(50) output
  153. as
  154. if exists (select * from student where stuNo=@stuNo)
  155. begin
  156. set @result='对不起,学号已存在!'
  157. end
  158. else
  159. begin
  160. insert into student
  161. (stuNo,stuName,stuAge,stuSex)
  162. values
  163. (@stuNo,@stuName,@stuAge,@stuSex)
  164. set @result='恭喜你,用户信息插入成功!'
  165. end
  166. go
  167. declare @result varchar(50)
  168. exec stu11 '06','王忠磊','1980-8-8 8:9:0','男',@result output
  169. print @result
  170. --------------------------------------------------------------------------
  171. --------------------------------------------------------------------------
  172. --存储过程查询当前用户的平均成绩与总的平均成绩之间的关系
  173. create proc stu12
  174. @stuNo varchar(50)
  175. as
  176. declare @curAvg decimal(18,2)
  177. declare @totalAvg decimal(18,2)
  178. if exists(select * from course where stuNo=@stuNo)
  179. begin
  180. set @totalAvg=(select AVG(courseScore) from course)
  181. select @curAvg=AVG(courseScore) from course where stuNo=@stuNo
  182. print ('总的平均分:'+convert(varchar(18),@totalAvg))
  183. print ('该生的平均分:'+convert(varchar(18),@curAvg))
  184. if @curAvg>@totalAvg
  185. print '高于平均水平!'
  186. else
  187. print '低于平均水平!'
  188. end
  189. else
  190. print '该生对应的分数信息不存在,请重新查询!'
  191. go
  192. exec stu12 '03'
  193. go

sqlserver存储过程学习(通俗易懂)_英雄主义-CSDN博客_sqlserver 存储过程

  1. 管理存储过程

  2. 执行存储过程

存储过程创建完成后,可以通过execute执行,简写为exec

  • 语法格式
  1. [{exec|execute}]
  2. {
  3. [@return_status=]
  4. {module_name[;number]|@modlue_name_var}
  5. [[@parameter=]{value
  6. |@variable[OUTPUT]
  7. |[DEFAULT]
  8. }
  9. ]
  10. [...n]
  11. [WITH RECOMPILE]
  12. }
  • 参数说明
参数 描述
@return_status 可选的整型变量,存储模块的返回状态。这个变量execute语句前,必须在批处理、存储过程或函数中声明过
module_name 是要调用的存储过程或标量值用户定义函数的完全限定或者不完全限定的名称。模块名称必须符合标识符规则。无论服务器的排序规则如何,扩展存储过程的名称总是区分大小写
number 是可选整数,用于对同名的过程分组。该参数不能用于扩展存储过程
@module_name_var 是局部定义的变量名,代表模块名称
@parameter module_name的参数,与在模块中定义的相同,参数名称前必须加上“@”符号
value 传递给模块或传递命令的参数值,如果参数名称没有指定,参数值必须以在模块中定义的顺序提供
@variable 是用来存储参数或返回参数变量
OUTPUT 指定模块或命令字符串返回一个参数,该模块或命令字符串中的匹配参数也必须使用关键字OUTPUT创建。使用游标变量作为参数时使用该关键字
DEFAULT 根据模块的定义,提供参数的默认值。当模块需要的参数值没有定义默认值并且缺少参数或指定了DEFAULT关键字,会出现错误
WITH RECOMPILE 指定模块后,强制编译、使用和放弃新计划。如果该模块存在现有查询计划,则该计划将保留在缓存中
  1. 查看存储过程

  2. 使用sys.sql_modules查看存储过程的定义

  1. select * from sys.sql_modules
  1. 使用OBJECT_DEFINITION查看存储过程的定义
  1. -- object_id 要查看的存储过程id
  2. select OBJECT_DEFINITION(object_id)
  1. 使用sp_helptext查看存储过程的定义
  1. sp_helptext 'proc_student'

原文链接:http://www.cnblogs.com/asdffdsa/p/14446794.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号