EF中存储过程的使用
2024-10-21 05:32:42
存储过程即用来完成一个特定功能的一段代码。它的优缺点
优点
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 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, );
//输出参数
SqlParameter paramOut = new SqlParameter("return_value", );
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;
最新文章
- java中自动装箱的问题
- 制作苹果推送通知APNS服务器证书文件
- mysqldump常用参数
- Matlab2012a第一次安装打不开 查找程序安装类时出错
- Javascript:getElementsByClassName
- 详解HashMap的内部工作原理
- boost:库program_options--第一篇
- 一个用于上传文件的servlet
- Can you solve this equation?
- Java虚拟机运行时内存区域简析
- 2017年5月11日17:43:06 rabbitmq 消费者队列
- Karen and Game CodeForces - 816C (暴力+构造)
- ubuntu 配置 apt 使用代理
- 【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
- IE上如何设置input type=file的光标不闪烁
- MySQL order by的实现
- linux-centos使用 wget命令获取jdk
- Twitter Bootstrap 中文帮助文档
- Gartner 2018新技术成熟度曲线
- MiniUi-----Spinner 数值调节器(可以实现任意值的递增)