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;

 

 

转载于:https://www.cnblogs.com/axqa/p/11436456.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值