zoukankan      html  css  js  c++  java
  • 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;
     
  • 相关阅读:
    2021/9/20 开始排序算法
    快速排序(自己版本)
    2021/9/17(栈实现+中后缀表达式求值)
    2021/9/18+19(中缀转后缀 + 递归 迷宫 + 八皇后)
    20212021/9/13 稀疏数组
    2021/9/12 线性表之ArrayList
    开发环境重整
    Nginx入门
    《财富的帝国》读书笔记
    Linux入门
  • 原文地址:https://www.cnblogs.com/jerque/p/11436456.html
Copyright © 2011-2022 走看看