首页 > 代码库 > SQL Server 为代码减负之存储过程

SQL Server 为代码减负之存储过程

    存储过程可以用来提高数据库的查询效率,因为它事先被编译过,被储存于内存中,每次执行前,不必被从新编译,所以效率很高。存储过程是一组sql增删改查的集合,如果程序中的一个功能涉及到对数据库的多次操作,那么就可以事先编译好存储过程,以提高程序运行效率!

    简单查询:

CREATE PROCEDURE sp_query_online_info
AS 
SELECT *FROM T_OnLine_info 
GO

    执行存储过程:

EXEC sp_query_online_info 

    带参数的存储过程:

CREATE PROCEDURE insert_OnLine @cardno varchar(10), @ondate varchar(10),@ontime varchar(10),@AdminName varchar(10)
AS INSERT INTO T_OnLine_info (cardNo,onDate,onTime,adminName)
VALUES (@cardno,@ondate,@ontime,@AdminName )
GO


    调用此存储过程:

exec insert_OnLine '00001' ,'8/21/2014' ,'22:22:22', '刘颖

日结账单涉及多张表的查询,所以这里用存储过程再合适不过了

在这里说一下,机房收费系统的日结账单的逻辑,如果机房管理正规的话,会有一个固定的时间点,操作员(当天工作过的)来找管理员结账,将手里的钱交给管理员,并将操作员结账信息记录在数据库中,记录中包含当天此操作员经手的充值金额和退还金额,将所有操作员经手的充值金额和退还金额汇总后,就是今天日结账单中的充值金额和退还金额,日结账单中的消费金额从T_line_info表中获取,本期余额应该从T_students_info中获取,昨日卡中余额应该日结账单的前一天的sumMoney列。所以日结账单的刷新也是要在有新的操作员结过账的情况下。日结账单中一天应该仅存有一条记录,管理员每天下班之前,必须验证日结账单里的账目与自己手里的账目一致才能下班,如果不一致,就说明有操作员还未结账,管理员就不能下班。可见日结账单是涉及多张表的,在这里用存储过程在合适不过了


CREATE PROCEDURE create_DStatement
AS 

DECLARE @SDate VARCHAR(10)					---结账日期,也就是今天
DECLARE @DATE AS VARCHAR(10)				----离今天最近的日期
DECLARE @remainMoney numeric(18,0)			---昨日余额
DECLARE @RechargeMoney numeric(18,0)		---今日充值金额
DECLARE @consumeMoney numeric(18,0)			---今日消费金额
DECLARE @cancelMoney  numeric(18,0)         ---今日退卡金额
DECLARE @sumMoney numeric(18,0)				---总金额


SET @SDate =CONVERT(VARCHAR(10),GETDATE(),20) --给@SDate赋值

DELETE FROM T_DStatement_info WHERE SDate=@SDate ----删除日结账单中今天的记录

SET @DATE =(SELECT MAX(CONVERT(VARCHAR(10),SDATE) )FROM T_DStatement_info )----获取距离今天最近的一天日结记录

SELECT @remainMoney =(SELECT sumMoney  FROM T_DStatement_info WHERE SDate=@DATE )
IF @remainMoney  is NULL 
SET @remainMoney =0

SELECT @RechargeMoney =(SELECT SUM(CONVERT(numeric(18, 0),rechargeMoney)) FROM T_Statement_info WHERE SDate=@SDate )
IF @RechargeMoney  Is nuLL  
SET @RechargeMoney =0

SELECT @consumeMoney =(SELECT SUM(CONVERT(numeric(18, 0),consume)) FROM T_Line_info WHERE offDate =@SDate )
IF @consumeMoney is NULL 
SET @consumeMoney =0

SELECT @cancelMoney =(SELECT SUM(CONVERT(numeric(18, 0),cancelMoney))FROM T_Statement_info WHERE SDate =@SDate )
IF @cancelMoney is NULL 
SET @cancelMoney =0

SELECT @sumMoney =(SELECT SUM(CONVERT(numeric(18, 0),cash)) FROM T_Students_info )
IF @sumMoney  is NULL 
SET @sumMoney=0

INSERT INTO T_DStatement_info (remainMoney,rechargeMoney,consumeMoney,cancelMoney ,sumMoney,SDate ) VALUES(@remainMoney,@RechargeMoney,@consumeMoney,@cancelMoney,@sumMoney,@SDate )

那么存储过程如何在VB.net中调用呢?很简单

运用存储过程,使我的日结账单的生成,比第一次机房的时候,相对简单了很多。



SQL Server 为代码减负之存储过程