SQLServer 存储过程

存储过程(Stored Procedure) 是一种预编译的SQL代码块,它被存储在数据库中,并可以通过名称调用执行。存储过程可以包含一个或多个SQL语句,用于完成特定的任务或操作。

优点:

  1. 提高性能:存储过程是预编译的,执行时无需重新解析和优化,因此可以提高查询效率。
  2. 减少网络流量:通过在网络上传输存储过程名称而不是大量SQL代码,减少了客户端与服务器之间的数据传输量。
  3. 增强安全性:可以对存储过程设置权限,限制用户直接访问底层表数据。
  4. 代码重用:存储过程可以被多次调用,避免重复编写相同的SQL代码。

简单使用

1. 创建两个表

create table student
(
id int identity(1,1),
stuNo varchar(50) primary key,
stuName varchar(50),
stuAge datetime,
stuSex varchar(5)
)
create table course
(
id int identity(1,1),
stuNo varchar(50),
courseName varchar(50),
courseScore decimal
)
insert into student(stuNo,stuName,stuAge,stuSex) values('01','张三','1996-08-27 09:00:00','男')
insert into student(stuNo,stuName,stuAge,stuSex) values('02','李四','1995-04-27 09:00:00','男')
insert into student(stuNo,stuName,stuAge,stuSex) values('03','王二','1996-03-27 09:00:00','女')
insert into course values('01','数学',88),('01','语文',55),('01','英语',67)
insert into course values('02','数学',66),('02','语文',80),('02','英语',78)
insert into course values('03','数学',55),('03','语文',90),('03','英语',72)

 2. 无参数的存储过程

查询学生表的所有信息

--创建存储过程,名为readAllStudent
create proc readAllStudent
as
--查询所有学生信息
select * from student
go
--执行存储过程
exec readAllStudent

3. 有参数的存储过程

查询某个学生的信息

--创建有参数的存储过程
create proc readOneStudent
--创建变量
@stuName varchar(50)
--设置变量默认值
--@stuName varchar(50) = '张三'
as
select * from student where student.stuName = @stuName
go
--执行存储过程
exec readOneStudent '张三'

4. 有输出参数

查询某个学生的性别

--查询单个学生的性别
create proc procQueryStudentAge
@sname varchar(50),
@result varchar(8) output --输出参数
as
select @result = stuSex from student where @sname=stuName
go
declare @result varchar(8) --声明变量
exec procQueryStudentAge '张三',@result output
print @result --输出

 ADO.NET操作存储过程

1. 创建命令对象

using (SqlCommand command = new SqlCommand("存储过程名称", connection))
{
command.CommandType = CommandType.StoredProcedure;
// 添加参数...
// 执行操作...
}

2. 输入参数

command.Parameters.AddWithValue("@参数名", 参数值);

3. 输出参数

SqlParameter outputParam = new SqlParameter
{
ParameterName = "@输出参数名",
SqlDbType = SqlDbType.Int, // 根据实际类型调整
Direction = ParameterDirection.Output
};
command.Parameters.Add(outputParam);

4. 返回值

SqlParameter returnParam = new SqlParameter
{
ParameterName = "@ReturnValue",
SqlDbType = SqlDbType.Int,
Direction = ParameterDirection.ReturnValue
};
command.Parameters.Add(returnParam);

EF Core执行存储过程

var role = "Admin";
var users = await context.Users
.FromSqlRaw("EXEC GetUsersByRole @Role", new SqlParameter("@Role", role))
.ToListAsync();

 

posted @   getRainbow  阅读(25)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示