EF中存储过程的使用
存储过程即用来完成一个特定功能的一段代码。它的优缺点
优点
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等。
缺点
- 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
- 存储过程的性能调校与撰写,受限于各种数据库系统。
1.常用存储过程的格式如下
create procedure sp_name @[参数名] [类型],@[参数名] [类型] as begin ......... end 以上格式还可以简写成: create proc sp_name @[参数名] [类型],@[参数名] [类型] as begin ......... end /*注:“sp_name”为需要创建的存储过程的名字,该名字不可以以阿拉伯数字开头*/ 调用存储过程 存储过程可以在三种环境下被调用: command命令下,基本语法为:exec sp_name [参数名]; SQL环境下,基本语法为:call sp_name [参数名]; PL/SQL环境下,基本语法为:begin sp_name [参数名] end; 删除存储过程 1.基本语法: drop procedure sp_name
实际存储过程调用示例:
USE DataBase --数据库名 GO /****** Object: StoredProcedure [dbo].[dbSixMonthConversion] Script Date: 2019/8/30 14:47:10 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= ALTER PROCEDURE [dbo].[dbProcdureName] -- 存储过程名称 @currentDate DATETIME -- Add the parameters for the stored procedure here AS BEGIN CREATE TABLE #TempTable --创建临时表缓存数据 ( MonthCount INT , YearCount INT , AnyValue INT ); DECLARE @i INT; --循环插入数据 SET @i = 0; WHILE @i < 6 BEGIN DECLARE @date DATETIME = DATEADD(MONTH, -@i, @currentDate); INSERT INTO #TempTable ( MonthCount , YearCount , AnyValue ) VALUES ( YEAR(@date) , -- MonthCount - int MONTH(@date) , -- YearCount - int ( SELECT COUNT(1) FROM atjubodb.dbo._User WHERE ID NOT IN ( SELECT DISTINCT UserID FROM atjubodb.dbo._Order WHERE CreateTime IS NOT NULL AND State IS NOT NULL AND State > 0 AND CreateTime <= @date )--'2019/8/1 0:00:00' AND ID IN ( SELECT DISTINCT UserID FROM atjubodb.dbo._Order WHERE CreateTime IS NOT NULL AND State IS NOT NULL AND State > 0 AND YEAR(CreateTime) = YEAR(@date) AND MONTH(CreateTime) = MONTH(@date) ) ) ); -- AnalyticalValue - int SET @i = @i + 1; END; SELECT * FROM #TempTable; DROP TABLE #TempTable; RETURN 1; -- Insert statements for procedure here END;
2.EF中存储过程的调用,带输出参数
DateTime currentDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); //输出参数 SqlParameter paramOut = new SqlParameter("return_value", 0); paramOut.Direction = ParameterDirection.Output; //输入参数 SqlParameter paramIn = new SqlParameter("currentDate", currentDate); var querys = dbContext.Database.SqlQuery<AppSixMonethStatisics>("EXEC [dbo].[dbProcdureName] @currentDate,@return_value output", new object[] { paramOut,paramIn }).ToList();
3.Sql中简单循环的使用
SET @i = 0; WHILE @i < 6 BEGIN END;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用