存储过程概述
为了实现特定任务,而将一些需要多次调用的固定操作语句编写成程序段,这些程序段储存在服务器上,由数据库服务器通过子程序来调用
存储过程的优缺点
优点 | 缺点 |
---|---|
存储过程加快系统运行速度,存储过程只在创建时编译,以后每次执行都不需要重新编译。 | 数据库移植不方便,存储过程依赖于数据库管理系统,SQL Server 2012 储存过程中封装的操作代码不能直接移植到其他的数据库管理系统中。 |
存储过程可以封装复杂的数据库操作,简化操作流程,例如对多个表的更新、删除等。 | 不支持面向对象的设计,无法采用面向对象的方式将逻辑业务进行封装,甚至形成通用的可支持服务的业务逻辑框架。 |
可以实现模块化的程序设计,存储过程可以多次调用,提供统一的数据库访问接口,改进应用程序的可维护性。 | 代码可读性查、不易维护。 |
存储过程可以降低网络流量,储存过程代码直接存储于数据库中,在客户端与服务器的通信过程中,不会产生大量的T-SQL代码流量。 | 不支持集群。 |
如何创建存储过程
1.不带参数的存储过程的创建和调用
创建存储过程
create proc 存储过程名
--修改
alter proc 存储过程名字
--删除
drop proc 存储过程名字
举例
--创建存储查询数据
create proc cp_select_book_byNames
as
select * from Books
go
--调用
exec cp_select_book_byNames
go
2.带输入参数的存储过程的创建和调用
create proc cp_select_book_byName
(
@name varchar(50)
)
as
select * from books where name like '%'+name+'%'
--调用
exec cp_select_book_byName '水浒123'
go
3.带输出参数的存储过程的创建和调用
--根据名称查询,返回记录,用手返回记录数
create proc cp_select_books_ByNameExt
(
@name varchar(50),
@recordRows int out--输出类型
)
as
select * from books where name like '%'+@name+'%'
select @recordRows=count(*) from books
go
--调用
--定一个变量,接收返回参数@recordRowsd的值
declare @rs int
exec cp_select_books_ByNameExt '水浒传',@rs out
print '查询的记录数是:'+convert(varchar(5),@rs)
4.分页
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