文章目录
- 概述
- 创建存储过程
- 无参存储过程
- 有参存储过程
- 有参有输出存储过程
- 存储过程完成分页功能
- 分页例子
- 存储过程所在位置
- 删除存储过程
概述
存储过程是一组预编译的SQL语句,其优点是允许模块化设计,也就是说只需创建一次,以后在程序中就可以多次调用,如果某次操作需要执行多条SQL语句,那么使用存储过程比单纯的执行SQL语句的速度要快
如果有C#或者Java等语言基础的同学可以将存储过程理解为那些编程语言里的方法
SQL Serve存储过程主要分为:
- 无参存储过程
- 有参存储过程
- 有参有输出存储过程
在SQL Server数据库里系统也自带了许多存储过程,本文主要讲述的是用户自定义存储过程。
创建存储过程
无参存储过程
创建无参存储过程的语法
create proc cp_select_book
as
select * from [dbo].[Books]
语法解析:
create proc(proc是创建存储过程的关键字) 存储过程名
as
需要执行的操作
调用无参存储过程
exec cp_select_book
使用exec关键字后面加上存储过程名调用存储过程
有参存储过程
创建有参存储过程很简单,和无参的类似,只不过是在定义的时候存储过程名后面要跟上一对小括号里面定义参数
create proc cp_select_book
(
@name nvarchar(50)
)
as
select * from [dbo].[Books]
where name = @name
这里创建有参存储过程的时候,是变量名在前,变量类型在后,记得不要搞返了,如果有多个参数则以逗号 ‘,’ 分开
调用存储过程
exec cp_select_book '我是有参存储过程'
调用的时候加上对应类型的参数就ok了,调用的时候就不用()小括号,多个参数也是逗号分开
有参有输出存储过程
所谓有输出的存储过程就是把变量传递给这个存储过程之后,经过处理可以改变这个变量的值
模拟场景:当我按条件查询一个表的信息的时候并且需要得到他所有的记录条数,这个时候就要用到有输出的存储过程了
create proc cp_select_booke_byNameExt
(
@name varchar(20),
--out关键字就代表这是输出参数
@recorRows int out
)
as
select * from [dbo].[Books] where name like '%'+@name+'%'
--计算总记录数
select @recorRows=COUNT(*) from [dbo].[Books] where name like '%'+@name+'%'
如果参数是输出参数的话,则只要在定义形参的时候在后面加上out 关键字
调用有参有输出存储过程
--定义一个变量用来接收返回参数
declare @recorRows int
--传入参数的时候也要加上out关键字
exec cp_select_booke_byNameExt 'vue',@recorRows out
--打印出总记录数
print @recorRows
--查询books表所有数据,用来做区分
select * from [dbo].[Books]
执行结果:
可以看到符合条件的数据只有一条,那么问题来了,我要的显示符合总记录是应该是一个数字,但是他没显示出来??
其实当我们使用了print打印出来的数据都在“消息”这个选项卡里
可以看到确实是一条记录
存储过程完成分页功能
在日常开发中,分页是经常要用到的,如果我们一次性把数据库里的数据全部查询出来的话,数据少的时候可能感受不出来,但数据达到上万条甚至更多的话,查询时间就会很长,这也就意味着用户需要等待一段时间才能看到内容,所以对用户体验不太友好。这个时候就要用到分页功能,按量显示数据,这样系统执行速度也会相对较快
分页例子
create proc cp_select_booke_paging
(
@name nvarchar(50),--按照名称来查询
@pageIndex int,--第几页
@pageSize int,--每页显示数量
@totalCount int --所有页面的总记录数
)
as
select top (@pageSize) * from [dbo].[Books]
where name like '%'+@name+'%' and id not in (select top ((@pageIndex-1)*@pageSize) ID
from [dbo].[Books] order by ID)
order by ID
--查询总记录数
select @totalCount=COUNT(*) from [dbo].[Books] where name like '%'+@name+'%'
调用
select * from [dbo].[Books]
declare @totalCount int
--查询第一页并且每页显示两条内容
exec cp_select_booke_paging '',1,2,@totalCount
print @totalCount
查询结果:
再来看看第二页的数据是否正确,第二页应该显示“西游记”和“红楼梦”这两条数据
按照预期的执行,分页完成。SQL Server分页的方法也有很多种,网上也有很多教程这里只介绍一种,不多过概述分页。
存储过程所在位置
我们上面创建了那么多个存储过程,那么在哪里可以看到我们创建的存储过程呢?
数据库展开>可编程性>存储过程
我们在数据库定义的所有存储过程都会在这个位置找到
删除存储过程
drop proc cp_select_book
使用 drop proc 关键字加上存储过程名来删除存储过程