【C#重构】——组合查询,存储过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/xml1996/article/details/84167126
今日推荐