版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xml1996/article/details/84167126
为什么要用存储过程?
在之前的D层中查询一个表的SQL语句可以这样写:
//查询student_info表里,满足UserID=用户输入的值;SudentID>=用户输入的值
string sql = "SELECT * FROM student_info WHERE UserID = @UserID AND StudentID >=@StudentID";
但是要实现:用户需要动态选择输入的值,有可能是UserID>=输入的值;也有可能StudentID<输入的值
也就是说输入的查询内容可变,=<>不定的变量的时候,或者我们要查的表都是可变的,怎么办呢?
可以考虑,把这些可变的内容设置成变量,封装在一起,通过调用这它的名字来实现功能,那么这个封装的容器叫做存储过程。
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
适用范围:
1.存储过程处理比较复杂的业务时比较实用
(1)、响应时间上
优势:如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话,就只有一次。存储过程可以给我们带来运行效率提高的好处;
(2)、更安全
使用存储过程的系统更加稳定:程序容易出现BUG 不稳定,而存储过程,只要数据库不出现问题,基本上是不会出现什么问题的。
2.数据量小的项目不用存储过程也可以正常运作。
推荐博客:存储过程意义
实践是检验真理的唯一标准
【创建】
PS:借鉴杨子颖的博客图片
【内容解析】
创建之初的内容解析,了解存储过程的结构
-- ================================================
USE [ 应用的数据库名字]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <姓名>
-- Create date: <创建日期>
-- Description: <创建内描述>
-- =============================================
--创建存储过程< (参数) [属性] <语句> >
CREATE PROCDURE <Procedure_Name, sysname, ProcedureName>
-- Add the parameters for the stored procedure here 在这里添加存储过程的参数
AS
--as中定义一个存储过程中使用的变量
declare......
--存储过程体begin ... end
BEGIN
-- 当没必要返回给客户端“n 行受到影响”消息时,在存储过程的开始应设置 SET NOCOUNT ON,提高网络性能。
SET NOCOUNT ON;
-- Insert statements for procedure here此处插入过程语句
SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO
推荐博客:存储过程结构详解
【实例】
USE [charge_sys]
GO
/****** Object: StoredProcedure [dbo].[PROC_Group] Script Date: 2018/11/17 9:26:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: xml
-- Create date: 公元前221年
-- Description: 组合查询学生信息
-- =============================================
ALTER PROCEDURE [dbo].[PROC_Group]
/***需要传递的参数****/
@CmbName1 varchar(20),
@CmbName2 varchar(20),
@CmbName3 varchar(20),
@Cmboper1 varchar(20),
@Cmboper2 varchar(30),
@Cmboper3 varchar(20),
@Cmbrelation1 varchar(20),
@Cmbrelation2 varchar(20),
@Txtcontext1 varchar(20),
@Txtcontext2 varchar(20),
@Txtcontext3 varchar(20),
/***需要的数据库的名称****/
@GetDataTable varchar(20)
AS
declare @TempSql varchar(500)
BEGIN
/***CmbName1查询字段的名称;Cmboper1<>=名称;Txtcontext1输入查询内容****/
SET @TempSql='SELECT * FROM '+@GetDataTable +' WHERE ' +@CmbName1+@Cmboper1+char(39) + @Txtcontext1 + char(39)
if( @Cmbrelation1!='')
BEGIN
SET @TempSql=@TempSql+@Cmbrelation1+CHAR(32)+@CmbName2+@Cmboper2+CHAR(39)+@Txtcontext2 + CHAR(39)
if(@Cmbrelation2!='')
BEGIN
SET @TempSql=@TempSql+@Cmbrelation2+CHAR(32)+@CmbName3+ @Cmboper3+CHAR(39)+@Txtcontext3+CHAR(39)
END
END
EXECUTE(@TempSql)
END