存儲過程即用來完成一個特定功能的一段代碼。它的優缺點
優點
- 存儲過程可封裝,並隱藏復雜的商業邏輯。
- 存儲過程可以回傳值,並可以接受參數。
- 存儲過程無法使用 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;