转账存储过程可参考以下代码逻辑:
USE [数据库名]
GO
/****** Object: StoredProcedure [dbo].[SP_TransferMoney] Script Date: 2018/9/25 8:25:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SP_TransferMoney]
@userId INT,--操作人
@fromMemberCardId VARCHAR(64),--转账人的卡号
@toMemberCardId VARCHAR(64),--收款人的卡号
@transferMoney DECIMAL,--转账金额
@remark NVARCHAR(128),--备注
@errorMsg NVARCHAR(128) OUTPUT--错误消息
AS
DECLARE @formId INT--转账人的主键Id
DECLARE @toId INT --收款人主键Id
--1.转账人的会员卡是否存在
IF ( SELECT COUNT(*) FROM dbo.MemCards WHERE MC_CardID=@fromMemberCardId)<=0-- 如果结果小于0说明转账人会员卡不存在
BEGIN
SET @errorMsg='转账人的会员卡不存在';
RETURN;
END
SELECT @formId=MC_ID FROM dbo.MemCards WHERE MC_CardID=@fromMemberCardId --对转账人的主键Id赋值
--2.收款人的会员卡是否存在
IF ( SELECT COUNT(*) FROM dbo.MemCards WHERE MC_CardID=@toMemberCardId)<=0-- 如果结果小于0说明收款人会员卡不存在
BEGIN
SET @errorMsg='收款人的会员卡不存在';
RETURN;
END
SELECT @toId=MC_ID FROM dbo.MemCards WHERE MC_CardID=@toMemberCardId --对收款人的主键Id赋值
--3.转账的金额是否小于余额
IF ( SELECT MC_Money FROM dbo.MemCards WHERE MC_CardID=@fromMemberCardId)<@transferMoney --如果余额小于转账金额,提示余额不足
BEGIN
SET @errorMsg='转账人的余额不足';
RETURN;
END
BEGIN TRANSACTION --开启事务
BEGIN TRY
UPDATE dbo.MemCards SET MC_Money=MC_Money-@transferMoney WHERE MC_ID=@formId;--给转账人扣钱
UPDATE dbo.MemCards SET MC_Money=MC_Money+@transferMoney WHERE MC_ID=@toId;--给收款人加钱
--写入转账日志
INSERT INTO dbo.TransferLogs
( S_ID ,
U_ID ,
TL_FromMC_ID ,
TL_FromMC_CardID ,
TL_ToMC_ID ,
TL_ToMC_CardID ,
TL_TransferMoney ,
TL_Remark ,
TL_CreateTime
)
VALUES ( 2 , -- S_ID - int
@userId , -- U_ID - int
@formId , -- TL_FromMC_ID - int
@fromMemberCardId, -- TL_FromMC_CardID - nvarchar(50)
@toId , -- TL_ToMC_ID - int
@toMemberCardId , -- TL_ToMC_CardID - nvarchar(50)
@transferMoney , -- TL_TransferMoney - money
@remark , -- TL_Remark - varchar(200)
GETDATE() -- TL_CreateTime - datetime
)
COMMIT TRANSACTION --提交事务
END TRY
BEGIN CATCH
RAISERROR('处理异常',16,1)
ROLLBACK TRANSACTION--回滚事务
END CATCH