一个云端充值的Sql Server存储过程示例

一个云端充值的Sql Server存储过程示例

一、充值相关的表:

1、充值要变更tb_Customer表

LeftMoney ,当前余额 , 需要加上充值额
DepositSum ,充值总额 , 需要加上充值额
ConsumeNo ,卡操作序号 ,需要加1

ForceAct 用leftmoney去强制同步cardleftmoney,是一个“卡片修复的行为”
UnInformedMoney 若ForceAct的值是单数,不需要变动;若是0或双数,则要加上充值额

2、在tb_Operlog中增加一条记录

二、实现代码



USE [CASH]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [dbo].[pr_addMoney]
    @Cash money, --充值金额
    @CardIDH varchar(16) , --需要充值的卡号

    @AccExist int OUTPUT, --用户存在或不存在标记
    @LogID int OUTPUT   --充值成功的tb_OperLog记录LogID

AS
BEGIN
DECLARE @ERROR INT  --定义
SET @ERROR=0    --事务回滚判断条件:错误计数

SET XACT_ABORT ON
    BEGIN TRAN tran_addMoney --开始事务

        IF exists
            (SELECT AccountNo
             FROM [CASH].[dbo].[tb_Customer]
             WHERE [email protected]) --判断用户是否存在,并且印刷卡号和物理卡号一致
             --WHERE [email protected] AND CardIDH=CardID) --测试卡号的发卡卡号和物理卡号不一致,临时注释掉

        BEGIN
            SET @AccExist =1    --存在标记1

            --局部变量
            DECLARE
            @AccountNo int, --用户编号
            @CustomerName varchar(32), --用户名
            @deptNo varchar(12),    --班级号
            @ClassNo tinyint,   --人员类别
            @LeftMoney  money,  --原余额
            @ConsumeNo int, --序号
            @ConsumeNoC int,    --卡操作序号
            @CardLeftMoney money,   --卡中余额
            @ExChgDate datetime,    --充值日期

            @TempID int, --临时ID值
            @TempAcc int --临时账户值

            SET @ExChgDate=convert(datetime,convert(char(10),GetDate(),120), 20); --为一个特殊格式的字段赋初值

            --查询出充值人名字
            SELECT  @AccountNo=AccountNo,
                    @CustomerName=CustomerName,
                    @deptNo=DeptNo,
                    @ClassNo=ClassNo,
                    @LeftMoney=LeftMoney,
                    @ConsumeNo=ConsumeNo,
                    @ConsumeNoC=ConsumeNoC,
                    @CardLeftMoney=CardLeftMoney
            FROM [CASH].[dbo].[tb_Customer]
            WHERE [email protected];

            BEGIN
                SELECT @TempID=MAX(LogID) FROM [CASH].[dbo].[tb_OperLog]; --查询添加充值记录前最大LOGID

                --在tb_OperLog添加充值明细
                INSERT INTO [CASH].[dbo].[tb_OperLog]
                    (EDate,OperatorNo,AccountNo,CustomerName,deptNo,ClassNo,Times,AccCount,OldLeftMoney,LeftMoney,AccLeftMoney,GLF,YJ,CardFee,Cash,ItemNo,ConsumeNo,ConsumeNoC,CardLeftMoney,LocaAreaNo,OperAreaNo,ExChgDate)
                VALUES
                    (GETDATE(),100,@AccountNo,@CustomerName,@deptNo,@ClassNo,1,0,@LeftMoney,@[email protected],@Cash,0,0,0,0,11,@ConsumeNo+1,@ConsumeNoC,@CardLeftMoney,1,1,@ExChgDate);

                SELECT @LogID=MAX(LogID)
                FROM [CASH].[dbo].[tb_OperLog]; --查询添加充值记录后最大LOGID

                SELECT @TempAcc=AccountNo
                FROM [CASH].[dbo].[tb_OperLog]
                WHERE [email protected]; --查询添加充值记录后最大LOGID所对应的用户账号

                IF ( (@LogID>@TempID) AND (@[email protected]) )   --添加记录成功后再执行充值操作
                    BEGIN
                        PRINT ‘在tb_OperLog添加充值明细成功@LogID是‘+CAST(@LogID as nvarchar(10));

                        --tb_Customer表充值(先添加充值记录成功,后执行充值操作)
                        UPDATE [CASH].[dbo].[tb_Customer]
                        SET [email protected],
                            [email protected],
                            ConsumeNo=ConsumeNo+1,
                            [email protected]
                        WHERE [email protected];
                    END

                ELSE
                    BEGIN
                        PRINT ‘在tb_OperLog添加充值明细失败,充值失败,请查明原因‘;
                        SET @[email protected]+1
                    END
            END

        END
        ELSE
            BEGIN
                SET @AccExist=0 --不存在标记0
                PRINT ‘查无此人,或账户异常,充值失败‘;
                SET @[email protected]+1
            END

        SET @[email protected][email protected]@ERROR   --系统报错和逻辑报错累加

        IF @ERROR<>0
            BEGIN
                ROLLBACK TRAN;
                PRINT ‘充值失败,@@ERROR是:‘+cast(@@ERROR as nvarchar(10))
            END
        ELSE
            BEGIN
                COMMIT TRAN;
                PRINT ‘账户为‘+cast(@AccountNo as nvarchar(8))+‘的‘[email protected]+‘充值‘+cast(@Cash as nvarchar(7))+‘成功‘  --打印充值成功信息
            END
END
**


一个云端充值的Sql Server存储过程示例

原文地址:http://blog.51cto.com/13710467/2105326

时间: 2024-10-30 15:56:09

一个云端充值的Sql Server存储过程示例的相关文章

SQL Server - 存储过程示例

/*     material器材表:id code name等     inventory库存表:id material_id material_code     1.库存表关联器材表,只关联了material_code,没有关联material_id(为null)     2.现在要根据material_code在器材表查询出material_id,然后赋值给库存表 */ DECLARE @maid VARCHAR(100),@macode VARCHAR(100) --定义两个变量(变量必

SQL Server 存储过程(转载)

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储

SQL Server 存储过程(转)

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储

SQL Server存储过程的初步认知

什么是存储过程? 存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令.实际上存储过程就是能完成一定操作的一组SQL语句. 为什么要用存储过程? 1.  存储过程只在创造时候编译,以后每次执行存储过程都不需要再重新的编译,而一般的SQL语句每执行一次就需要编译一次,所以使用存储过程可提高数据库执行速度. 2.  当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事物处理结合在一起. 3.  存储过程可以重复的使用,降低开发人员的工作量,提高工作效率. 4.  安全

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正常的SQL语句,使用了Union(All)查询: SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --备注信息 , ai

SQL Server 存储过程具体解释

SQL Server 存储过程具体解释 存储过程的优缺点 ◆长处: 运行速度更快. 存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快. 存储过程用于处理复杂的操作时,程序的可读性更强.网络的负担更小. 使用存储过程封装事务性能更佳. 能有效的放注入,安全性更好. 可维护性高.在一些业务规则发生变化时.有时仅仅需调整存储过程就可以.而不用修改和重编辑程序. 更好的代码重用. ◆ 缺点: 存储过程将给server带来额外的压力. 存储过程多多时维护比較

sql server 存储过程 拼接SQL 超过8000

问题描述: 公司需要做一个报表,根据人员组织树,点击某一节点的时候,显示下一个直接子节点的表单申请情况,根据表单状态进行分组. 实现思路: 一开始是想通过拼接SELECT SQL,将所有子节点的报表情况union,然后所谓存储过程的结果返回.调试过程中发现,拼接出来的SQL太长,在拼接过程中自动被截断了. 解决思路: 分别执行原本打算拼接的SELECT 语句,将每个结果一次插入一个临时表,最后将所有临时表的数据作为存储过程的结果返回. sql server 存储过程 拼接SQL 超过8000

VS中调用SQL SERVER存储过程

 存储过程是经过编译的,永久保存在数据中的一组SQL语句,通过创建和使用存储过程可以提高程序的重用性和扩展性,为程序提供模块化的功能,还有利于对程序的维护和管理.下面就详谈一下,VB.NET如何调用SQL SERVER中的存储过程. 以上就是本人数据库中的一张表-OnDutyInfo 创建存储过程 <span style="font-size:18px;">create procedure pro_OnDutyInfo --存储过程名 @teacherID char(1

SQL Server存储过程的使用

存储过程概述 简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理. 基本概念: SQL Server中的存储过程是使用T_SQL编写的代码段.它的目的在于能够方便的从系统表中查询信息, 或者完成与更新数据库表相关的管理任务和其他的系统管理任务.T_SQL语句是SQL Server数据库与应用程序之间的编程接口. 存储过程就是SQL Server为了实现特定任务,而将一些需要多次调用的固定操作语句编写成程序段,这些程序段存储在服务器上, 有数据库服务器通