55人参与 • 2025-12-14 • MsSqlserver
在数据库开发中,存储过程(stored procedure) 是一个非常重要的概念。它可以把一段 sql 语句封装起来,方便复用、提高效率,并增强安全性。本文将带你从入门到精通 sql server 的存储过程。
存储过程是一组预编译的 sql 语句集合,存储在数据库中,可以通过调用执行。简单来说,它就像数据库中的“小程序”,可以重复使用。
优点:
create procedure 存储过程名
as
begin
-- sql语句
select * from students;
end;调用存储过程:
exec 存储过程名; -- 或者 execute 存储过程名;
小技巧:可以用
sp_helptext 存储过程名查看存储过程内容。
存储过程可以接收参数,让 sql 更灵活:
create procedure getstudentbyage
@age int
as
begin
select * from students
where age = @age;
end;调用带参数的存储过程:
exec getstudentbyage @age = 18;
注意:参数可以是输入参数(in)、输出参数(out),也可以同时使用。
输出参数用于返回单个值给调用者:
create procedure getstudentcount
@totalcount int output
as
begin
select @totalcount = count(*) from students;
end;调用输出参数:
declare @count int; exec getstudentcount @totalcount = @count output; print @count;
存储过程支持 if...else 和 while 等流程控制:
create procedure checkstudentage
@age int
as
begin
if @age >= 18
print '成年学生';
else
print '未成年学生';
end;有时候条件复杂,需要动态生成 sql:
create procedure searchstudent
@columnname nvarchar(50),
@value nvarchar(50)
as
begin
declare @sql nvarchar(max);
set @sql = 'select * from students where ' + @columnname + ' = @val';
exec sp_executesql @sql, n'@val nvarchar(50)', @val = @value;
end;提示:动态 sql 要注意防止 sql 注入。
存储过程可以通过 try...catch 捕获错误:
create procedure dividenumbers
@a int,
@b int
as
begin
begin try
select @a / @b as result;
end try
begin catch
print '出错了:除数不能为0';
end catch
end;存储过程可以使用事务确保数据一致性:
create procedure transfermoney
@fromaccount int,
@toaccount int,
@amount decimal(10,2)
as
begin
begin transaction;
begin try
update accounts set balance = balance - @amount where accountid = @fromaccount;
update accounts set balance = balance + @amount where accountid = @toaccount;
commit transaction;
end try
begin catch
rollback transaction;
print '转账失败,事务已回滚';
end catch
end;sp_ 或 usp_ 前缀区分系统存储过程和用户存储过程,例如 usp_getstudentbyage。假设我们有一个学生表 students,我们想要实现一个存储过程:
create procedure usp_searchstudents
@age int = null,
@class nvarchar(20) = null,
@totalcount int output
as
begin
set nocount on;
select *
from students
where (@age is null or age = @age)
and (@class is null or class = @class);
select @totalcount = count(*)
from students
where (@age is null or age = @age)
and (@class is null or class = @class);
end;调用:
declare @count int; exec usp_searchstudents @age = 18, @class = 'a1', @totalcount = @count output; print @count;
从基础到高级,存储过程是 sql server 中 提高效率、封装逻辑、保证安全性的重要工具。掌握存储过程不仅可以让你写出高效、可维护的 sql,还能应对复杂的业务需求。
只要多练习,多结合实际项目,你也能成为存储过程高手。
到此这篇关于sql server 存储过程:从入门到精通的文章就介绍到这了,更多相关sql server 存储过程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论