SQL - 17.存储过程
1.存储过程---就像数据库中运行方法(函数)#
和C#里的方法一样,由存储过程名/存储过程参数组成/可以有返回结果。
前面学的if else/while/变量 等,都可以在存储过程中使用
优点:
-
执行速度更快
-
允许模块化程序设计
-
提高系统安全性
-
减少网络流通量
系统存储过程
由系统定义,存放在master数据库中
名称以“sp_”开头或”xp_”开头
自定义存储过程
由用户在自己的数据库中创建的存储过程
系统存储过程 | 说明 |
sp_databases | 列出服务器上的所有数据库。 |
sp_helpdb | 报告有关指定数据库或所有数据库的信息 |
sp_renamedb | 更改数据库的名称 |
sp_tables | 返回当前环境下可查询的对象的列表 |
sp_columns | 回某个表列的信息 |
sp_help | 查看某个表的所有信息 |
sp_helpconstraint | 查看某个表的约束 |
sp_helpindex | 查看某个表的索引 |
sp_stored_procedures | 列出当前环境中的所有存储过程。 |
sp_password | 添加或修改登录帐户的密码。 |
sp_helptext | 显示默认值、未加密的存储过程、用户定义的存储过程、触发器或视图的实际文本。 |
创建存储过程
定义存储过程的语法
CREATE PROC[EDURE] 存储过程名
@参数1 数据类型 = 默认值 OUTPUT,
@参数n 数据类型 = 默认值 OUTPUT
AS
SQL语句
参数说明:
参数可选
参数分为输入参数、输出参数
输入参数允许有默认值
EXEC 过程名 [参数]
(1)创建
(2)执行
exec usp_GetBookByCateId 2
(3)更改
alter procedure usp_GetBookByCateId
@cateId int
as
begin
select * from Book where b_Cid=@cateId
select * from Category
end
(4)再执行:exec usp_GetBookByCateId 2
例题:#
1.分页功能
(1)用ROW_NUMBER() over(order by XX) select ROW_NUMBER() over(order by c_id) as 'nid',* from Category (2)取1-5列 select * from (select ROW_NUMBER() over(order by c_id) as nid,* from Category) as a where a.nid<=5
(3)创建存储过程 --分页ROW_NUMBER()的存储过程
create procedure usp_GetPagesBooks @PageIndex int = 1 as
begin
select * from (
select ROW_NUMBER() over(order by c_id) as nid,* from Category )
as a where a.nid > (@PageIndex - 1)*5 and a.nid<= @PageIndex *5 end
执行 exec usp_GetPagesBooks 1 exec usp_GetPagesBooks 2 |
2.调用带参数的存储过程#
无参数的存储过程调用:
- Exec pro_GetAge
有参数的存储过程两种调用法:
- EXEC proGetPageData 60,55 ---按次序
- EXEC proGetPageData @labPass=55,@writtenPass=60 --参数名
参数有默认值时:
- EXEC proGetPageData --都用默认值
- EXEC proGetPageData 1 --页容量(@pageSize)默认值
- EXEC proGetPageData 1,5 --不用默认值
问题:如果我只想设置页容量(第二个参数),页码使用默认值呢?怎么办?
alter procedure usp_GetPagesBooks
@PageIndex int = 1,@PageSize int = 5
as
begin
select * from
(
select ROW_NUMBER() over(order by c_id) as nid,* from Category
)
as a
where a.nid > (@PageIndex - 1)* @PageSize and a.nid<= @PageIndex * @PageSize
end
3.存储过程中使用输出参数#
alter procedure usp_GetPagesBooks
@PageIndex int = 1,
@PageSize int = 5,@RowCount int output
as
begin
select * from
(
select ROW_NUMBER() over(order by c_id) as nid,* from Category
)
as a
where a.nid > (@PageIndex - 1)* @PageSize and a.nid<= @PageIndex * @PageSizeselect @RowCount = COUNT(*) from Category
set @PageIndex =10000
set @PageSize =100
end
如果希望在存储过程中查询当前页对应的结果集,而且还想产生总页数呢?
未完….
作者:【唐】三三
出处:https://www.cnblogs.com/tangge/archive/2012/08/29/2662094.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具