在开发机房收费系统个人重构版的过程中,我是根据功能来走的七层,这样就有一个弊端,一个功能就要走一遍七层,很是繁琐。而在很早之前我就听各位同学说到存储过程可以解决这一弊端,尤其是在组合查询和结账的时候,所以我打算在组合查询和结账功能的时候用一用存储过程,当然过程不是一帆风顺的,但是最后收获还是蛮大的。
什么是存储过程?
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数来执行它。
好了,那么我们应该如何写一个存储过程呢?需要经过以下几个步骤:
- 定义参数
- 写SQL语句
OK,步骤有了,下面我们来实战练习一遍。
组合查询
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
存储过程写完之后就可以使用了,这样原本写好几个七层的工作量立马变为写一个七层就完成了,很方便。