SQL Server 积分获取和消费的存储过程学习的解决办法

2022-11-12 09:42:18
内容摘要
这篇文章主要为大家详细介绍了SQL Server 积分获取和消费的存储过程学习的简单示例,具有一定的参考价值,可以用来参考一下。 对此感兴趣的朋友,看看idc笔记做的技术笔记! 1.GM_
文章正文

这篇文章主要为大家详细介绍了SQL Server 积分获取和消费的存储过程学习的简单示例,具有一定的参考价值,可以用来参考一下。

对此感兴趣的朋友,看看idc笔记做的技术笔记!

1.GM_JF客户账户积分表

2. GM_JF_DETAIL客户账户积分消费记录

3. GM_JF_ACTION _RULES积分动作规则表

4.GM_JF_GOODS _RULES积分商品规则表

代码如下:


-- ===============测试=======================================================
/*
declare @StatusCode int = 1;
exec sp_GM_JF_AddScore 'admin','AN_JF_001_001',1,5,0,'',@StatusCode output
print @StatusCode
*/
-- ===========================================================================
/*
* 判断是否重复获取积分(首次完善个人资料,首次修改密码等等不能重复获取积分)
* 判断是根据 从GM_JF_DETAIL(详情表)查询周期内的数据条数与GM_JF_ACTION_RULES(动作规则表)内的周期重复次数对比
* 如果大于等于周期重复次数,则为重复获取积分
* 接下来
* 1.详情表的数据入库
* 2.判断总积分表是否存在对应客户的总积分 没有则插入一条新的,有 则读取其数据,并更新
*
*/
ALTER PROCEDURE [dbo].[sp_GM_JF_AddScore]
@ACCOUNT_ID varchar(30),
@JF_CategoryNumber varchar(15),
@CARD_NUM int,
@HQ_JF_AMOUNT int,
@State varchar(16),
@USE_DESC varchar(400),

@StatusCode int output -- 状态码: 0:失败 1:成功 2: 不能重复获取ASBEGIN-- SET NOCOUNT ON added to prevent extra result sets from-- interfering with SELECT statements.SET NOCOUNT ON;

declare@repetitionsCycle float=0, --周期(天)@repetitionsCycle_second int=0,--周期(秒)@repetitionsFrequency int=0, --一个周期内允许最大次数@realFrequency int=0, --实际周期

@USE_DATE datetime = GETDATE();--是否重复获取积分select top(1) @repetitionsCycle=RepetitionsCycle,@repetitionsFrequency=RepetitionsFrequency from GM_JF_ACTION_RULES where AN_CategoryNumber=@JF_CategoryNumber;

if(@repetitionsCycle<1)BEGINset @repetitionsCycle_second = (@repetitionsCycle-1)*24*60*60;select @realFrequency=COUNT(1) from GM_JF_DETAIL where ACCOUNT_ID=@ACCOUNT_ID and JF_CategoryNumber=@JF_CategoryNumber and USE_DATE <= @USE_DATE and USE_DATE >= CONVERT(varchar(19),DATEADD(SECOND,-@repetitionsCycle_second,@USE_DATE),120)ENDELSEBEGINselect @realFrequency=COUNT(1) from GM_JF_DETAIL where ACCOUNT_ID=@ACCOUNT_ID and JF_CategoryNumber=@JF_CategoryNumber and USE_DATE <= @USE_DATE and USE_DATE >= CONVERT(varchar(10),DATEADD(DAY,-(@repetitionsCycle-1),@USE_DATE),120)END

if(@realFrequency>=@repetitionsFrequency) --实际周期大于周期次数beginset @StatusCode = 2;return 2;end

declare @count int = 0; --数据条数declare @temp_table table --表变量(ACCOUNT_ID varchar(30),JF_AMOUNT decimal(16,2),TTL_JF_AMOUNT decimal(16,2),Last_Update_Time datetime,[Version] int);

begin tran;--插入详情insert into GM_JF_DETAIL(ACCOUNT_ID,JF_CategoryNumber,CARD_NUM,HQ_JF_AMOUNT,[State],USE_DESC)values(@ACCOUNT_ID,@JF_CategoryNumber,@CARD_NUM,@HQ_JF_AMOUNT,@State,@USE_DESC)

--填充表变量insert into @temp_table select ACCOUNT_ID,JF_AMOUNT,TTL_JF_AMOUNT,Last_Update_Time,[Version] from GM_JF where ACCOUNT_ID=@ACCOUNT_IDselect @count = count(1) from @temp_table;--判断并更新总积分(0:添加 其他:修改)IF(@count=0)begininsert into GM_JF(ACCOUNT_ID,JF_AMOUNT,TTL_JF_AMOUNT)values(@ACCOUNT_ID,@HQ_JF_AMOUNT,@HQ_JF_AMOUNT)endelsebegindeclare @JF_AMOUNT int, --总积分@TTL_JF_AMOUNT int, --可用积分@Version int; --版本号

select @JF_AMOUNT=JF_AMOUNT,@TTL_JF_AMOUNT=TTL_JF_AMOUNT,@Version=[Version] from @temp_table where ACCOUNT_ID=@ACCOUNT_ID;

update GM_JF set JF_AMOUNT=(@JF_AMOUNT+@HQ_JF_AMOUNT),TTL_JF_AMOUNT=(@TTL_JF_AMOUNT+@HQ_JF_AMOUNT),Last_Update_Time=GETDATE(),[Version]=(@Version+1) where ACCOUNT_ID=@ACCOUNT_IDend

Commit tran;set @StatusCode = 1;

IF(@@ERROR<>0)BEGINset @StatusCode = 0;ROLLBACK tran;ENDEND

注:关于SQL Server 积分获取和消费的存储过程学习的简单示例的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!