【机房重构】存储过程(组合查询+结帐)

在开发机房收费系统我的重构版的过程当中,我是根据功能来走的七层,这样就有一个弊端,一个功能就要走一遍七层,非常繁琐。而在很早以前我就听各位同窗说到存储过程能够解决这一弊端,尤为是在组合查询和结帐的时候,因此我打算在组合查询和结帐功能的时候用一用存储过程,固然过程不是一路顺风的,可是最后收获仍是蛮大的。web

什么是存储过程?

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,存储在数据库中,通过第一次编译后调用不须要再次编译,用户经过指定存储过程的名字并给出参数来执行它。数据库

好了,那么咱们应该如何写一个存储过程呢?须要通过如下几个步骤:svg

  1. 定义参数
  2. 写SQL语句

OK,步骤有了,下面咱们来实战练习一遍。code

组合查询

USE [机房重构]
GO
/****** Object:  StoredProcedure [dbo].[PROC_GroupCheck]    Script Date: 2018/12/13 10:57:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Mark
-- Create date: 2018-11-29 09:05:21
-- Description:	组合查询时候进行数据交互
-- =============================================
ALTER PROCEDURE [dbo].[PROC_GroupCheck]  
/****定义须要传递的参数****/
@cboField1 varchar(20),
@cboField2 varchar(20),
@cboField3 varchar(20),
@cboMark1 varchar(10),
@cboMark2 varchar(10),
@cboMark3 varchar(10),
@txtContent1 varchar(20),
@txtContent2 varchar(20),
@txtContent3 varchar(20),
@Relationship1 varchar(10),
@Relationship2 varchar(10),
@DbtableName varchar(20)
AS
	declare @TempSql varchar(500)
BEGIN
/****具体查询语句,@DbtableName,@cboField1,@cboMark1返回具体参数,char(39)是单引号,char(32)是空格****/
	SET @TempSql='SELECT * FROM '+@DbtableName+' WHERE '+@cboField1+@cboMark1+char(39)+@txtContent1+char(39)
	if(@Relationship1!='')
	BEGIN
		SET @TempSql=@TempSql+@Relationship1+CHAR(32)+@cboField2+@cboMark2+char(39)+@txtContent2+char(39)
		if(@Relationship2!='')
		BEGIN
		SET @TempSql=@TempSql+@Relationship2+CHAR(32)+@cboField3+@cboMark3+char(39)+@txtContent3+char(39)
		END
    END
ExECUTE(@TempSql)
END

结帐

USE [机房重构]
GO
/****** Object:  StoredProcedure [dbo].[PROC_Account]    Script Date: 2018/12/13 10:52:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Mark
-- Create date: 2018-12
-- Description:	Accounts
-- =============================================
ALTER PROCEDURE [dbo].[PROC_Account]
			-- Add the parameters for the stored procedure here
	@Count int,
	@RechargeCash int,
	@CancelCash int,
	@ConsumeCash int,
	@AllCash int,
	@Date date,
	@UserID varchar(20),
	@CheckCash int
AS
	declare @IsCheck char(10)
BEGIN
	SET NOCOUNT ON;
	set @IsCheck='未结帐'
	set @UserID=@UserID

	--购卡
	if @Count=1
	begin 
		select StudentNo,CardNo,LoginDate,LoginTime from Student_Info where Ischeck='未结帐' and UserID=@UserID
	end 
	
	--充值状况:
	if @Count=2
	begin
		select CardNo,RechargeCash,Date,Time from Recharge_Info where IsCheck='未结帐' and UserID=@UserID
	end 
	--退卡状况
	if @Count=3
	begin 
		select CardNo,CancelCash,Date,Time from CancelCard_Info where IsCheck='未结帐'and UserID=@UserID
	end 

	--更新状况
	if @Count=4
	begin 
		update Student_Info set IsCheck='已结帐' where Ischeck=@IsCheck and UserID=@UserID
		update Recharge_Info set IsCheck='已结帐' where IsCheck=@IsCheck and UserID=@UserID
		update CancelCard_Info set IsCheck='已结帐' where IsCheck=@IsCheck and UserID=@UserID
		insert into Check_Info values (@CancelCash,@RechargeCash,@CheckCash,@UserID,@Date)
	end 
	if @Count=5
	begin
		select IsCheck from Student_Info where UserID=@UserID and Ischeck='未结帐'
	end 
END

存储过程写完以后就可使用了,这样本来写好几个七层的工做量立马变为写一个七层就完成了,很方便。xml