存储过程即用来完成一个特定功能的一段代码。它的优缺点

优点

  • 存储过程可封装,并隐藏复杂的商业逻辑。
  • 存储过程可以回传值,并可以接受参数。
  • 存储过程无法使用 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;
 

最新文章

  1. java中自动装箱的问题
  2. 制作苹果推送通知APNS服务器证书文件
  3. mysqldump常用参数
  4. Matlab2012a第一次安装打不开 查找程序安装类时出错
  5. Javascript:getElementsByClassName
  6. 详解HashMap的内部工作原理
  7. boost:库program_options--第一篇
  8. 一个用于上传文件的servlet
  9. Can you solve this equation?
  10. Java虚拟机运行时内存区域简析
  11. 2017年5月11日17:43:06 rabbitmq 消费者队列
  12. Karen and Game CodeForces - 816C (暴力+构造)
  13. ubuntu 配置 apt 使用代理
  14. 【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
  15. IE上如何设置input type=file的光标不闪烁
  16. MySQL order by的实现
  17. linux-centos使用 wget命令获取jdk
  18. Twitter Bootstrap 中文帮助文档
  19. Gartner 2018新技术成熟度曲线
  20. MiniUi-----Spinner 数值调节器(可以实现任意值的递增)

热门文章

  1. TOMCAT_server.xml
  2. mysql重点中的重点----&gt;查询中的关键字优先级
  3. oracle中的分组排序
  4. 线上服务器CPU彪高的调试方式
  5. CSS 盒子模型、RestCSS、浮动、定位
  6. Django的Form验证
  7. Eclipse——关联源代码
  8. ReactNative: 使用网页组件WebView组件
  9. Spring Cloud进阶之路 | 一:服务注册与发现(nacos)
  10. 程序结构设计理论(Android)