存储过程可以用来提高数据库的查询效率,因为它事先被编译过,被储存于内存中,每次执行前,不必被从新编译,所以效率很高。存储过程是一组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中调用呢?很简单
运用存储过程,使我的日结账单的生成,比第一次机房的时候,相对简单了很多。