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;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM