什么是存储过程?
- 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
- 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
- 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。
存储过程创建语法
create proc | procedure pro_name
[{@参数数据类型} [=默认值] [output],
{@参数数据类型} [=默认值] [output],
....
]
as
SQL_statements
操作实例
首先创建两张表
Student表
Course表
其中Course表中的F_StuId为Student表的F_ID是外键关联
增加测试数据,顺便练一下sql语法
DECLARE @i INT, @F_Name VARCHAR(50), @F_Age INT, @F_Sex VARCHAR(2), @F_Hobby VARCHAR(50), @ranNum INT
SET @i = 0
SET @F_Name = '小明'
SET @F_Age = 0
WHILE @i < 100
BEGIN
SET @ranNum = RAND() * 4 --生成一个0-3的随机数
IF @ranNum = 0
BEGIN
SET @F_Sex = '男'
SET @F_Hobby = '篮球'
END
ELSE IF @ranNum = 1
BEGIN
SET @F_Sex = '男'
SET @F_Hobby = '足球'
END
ELSE IF @ranNum = 2
BEGIN
SET @F_Sex = '女'
SET @F_Hobby = '刺绣'
END
ELSE
BEGIN
SET @F_Sex = '女'
SET @F_Hobby = '跳绳'
END
INSERT INTO Student (F_Name, F_Age, F_Sex, F_Hobby) VALUES (@F_Name + CONVERT(VARCHAR(3), @i), @F_Age + @i, @F_Sex, @F_Hobby)
SET @i = @i + 1
END
GO
DECLARE @i INT, @F_StuId INT, @F_Course VARCHAR(50), @F_Score INT, @ranNum INT
SET @i = 0
SET @F_StuId = 0
SET @F_Course = '语文'
SET @F_Score = 0
WHILE @i < 100
BEGIN
SET @ranNum = RAND() * 3
IF @ranNum = 0
BEGIN
SET @F_Course = '语文'
END
ELSE IF @ranNum = 1
BEGIN
SET @F_Course = '数学'
END
ELSE
BEGIN
SET @F_Course = '英语'
END
INSERT INTO Course (F_StuId, F_Course, F_Score) VALUES (@F_StuId + @i, @F_Course, @F_Score + @i)
SET @i = @i + 1
END
之后我们根据存储过程的语法创建一个无参的存储过程
create proc proc_get_student
as
select * from Student
创建好以后我们可以在可编程性中找到我们新建的存储过程
然后执行这个存储过程
exec proc_get_student
执行结果
接下来我们来创建一个带参数的存储过程
create proc proc_find_stu(@startId int, @endId int)
as
select * from Student where F_ID between @startId and @endId
执行存储过程(取到id为10-20的学生信息)
exec proc_find_stu 10,20
执行结果
接下来我通过一个存储过程来完成联表查询+分页显示
create proc proc_page(@currPage int, @pageSize int, @keyWord varchar(50))
as
select a.F_ID, a.F_Name, a.F_Sex, b.F_Course, b.F_Score from Student a left join Course b on a.F_ID = b.F_StuId
where [F_Name] like '%' + @keyWord + '%'
order by a.F_ID
offset ((@currPage - 1) * @pageSize) rows
fetch next @pageSize rows only
执行该存储过程
exec proc_page 1, 10, '0'
执行结果