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