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

本文阐述了在数据库操作中使用存储过程的优点,包括提高运行效率、增强安全性及简化复杂业务处理。介绍了存储过程的基本结构与创建方法,并通过具体实例展示了其在组合查询中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要用存储过程?

在之前的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
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邢美玲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值