微信储值卡订单过期存储过程_版本2
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,jankie> -- Create date: <Create Date,,2017-09-12 10:26> -- Description: <Description,,查询订单是否过期> --如果订单过期会自动设置IsDealWith为已处理。并且将Status设置为Closed_OutTime+'当时订单的状态' -- ============================================= /* exec [dbo].[IsClosedStoredCardOrders] @PageNumber=0, @PageSize=10, @BID=957, @OpenIDWhere=' ' , @StatusWhere=' ', @IsDealWithWhere=' ', @CardIDWhere=' ', @TradeIdWhere=' ', @CreateDateWhere='', @OuterIDWhere=' ', @NickNameWhere='' */ ALTER PROCEDURE [dbo].[IsClosedStoredCardOrders] @PageNumber nvarchar(1000),--当前页,从开始 @PageSize nvarchar(1000), @BID nvarchar(1000), @OpenIDWhere nvarchar(1000),--用户OpenID,后台不用分OpenID(所以前面传值得时候为空),手机端要分OpenID(要把值传过来) @StatusWhere nvarchar(1000),--订单支付状态 @IsDealWithWhere nvarchar(1000),--订单处理状态 @CardIDWhere nvarchar(1000),--卡号 @TradeIdWhere nvarchar(1000),--订单号 @CreateDateWhere nvarchar(1000),--下单时间段 @OuterIDWhere nvarchar(1000),--微信交易号 @NickNameWhere nvarchar(1000)--微信昵称 AS BEGIN declare /*声明标量*/ @TradeID varchar(100), @TimeNow datetime, --当前时间 @Status varchar(100), @OutTime datetime, @OrderByWhere nvarchar(100),--排序条件 @sqlRow nvarchar(3000) set @TimeNow=getdate() set @OrderByWhere='2'---排序条件,1是CreateDate升序asc,是CreateDate降序desc set @sqlRow =N' select Status,TradeID,OutTime from ( select Row_number() over(order by CreateDate desc ) as rownum,VCSTL.*,WU.NickName,WU.PicUrl,WU.RealName from ValueCardSaveTradeLog as VCSTL left join WxUsers as WU on VCSTL.CardID=WU.CardID and VCSTL.BID=WU.BID where VCSTL.TradeID=VCSTL.TradeID and VCSTL.BID=convert(int,'+@BID+') '+@StatusWhere+' '+@IsDealWithWhere+' '+@CardIDWhere+' '+@TradeIdWhere+' '+@CreateDateWhere+' '+@OuterIDWhere+' '+@NickNameWhere+' '+@OpenIDWhere+' )as t1 where t1.rownum>=convert(int,'+@PageNumber+')*convert(int,'+@PageSize+')+1 and t1.rownum<=((convert(int,'+@PageNumber+')+1)*convert(int,'+@PageSize+')) ' --创建临时表 Create Table #temp1(Status nvarchar(50),TradeID nvarchar(50),OutTime datetime) insert into #temp1 exec sp_executesql @sqlRow begin transaction; --开始执行事务 --查询所有已经过期的订单,更新过期订单的字段 declare updateOrder_Cursor cursor for --声明游标 select * from #temp1 --查询临时表数据,进行游标功能 OPEN updateOrder_Cursor --打开游标 FETCH NEXT FROM updateOrder_Cursor --获取游标的下一行数据 into @Status, --使变量获得当前游标指定行的订单状态 @TradeID, --使变量获得当前游标指定行的订单的单号 @OutTime --使变量获得当前游标指定行的订单的过期时间 ----------------------外部游标(主订单)begin -------------------------- WHILE (@@FETCH_STATUS = 0) --FETCH语句执行成功 begin if(@OutTime<=@TimeNow) begin --outtime --如果不是手动关闭或者还没关闭就开始执行语句,其他的就让游标跳过不更新 if(substring(ltrim(rtrim(@Status)),0,7)='NotPay' --or substring(ltrim(rtrim(@Status)),0,16)='HadPayNotInsert' --后面修改的需求,已付款待充值不能过期关闭,因为这是有问题的订单,只能手动关闭。 or substring(ltrim(rtrim(@Status)),0,10)='FinishPay') begin --substring --更新订单状态Status,IsDealWith update ValueCardSaveTradeLog set Status='Closed_OutTime_'+@Status,IsDealWith='1' where TradeID=@TradeID end --substring end --outtime FETCH NEXT FROM updateOrder_Cursor --获取游标的下一行(主订单) into @Status, --使变量获得当前游标指定行的订单状态 @TradeID, --是变量获得当前指定行的订单单号 @OutTime --使变量获得当前指定行的过期时间 end CLOSE updateOrder_Cursor --关闭游标(主订单) DEALLOCATE updateOrder_Cursor --释放游标(注订单) drop table #temp1 --释放临时表 ----------------------外部游标(主订单)end -------------------------- if(@@error>0) begin rollback transaction --事务回滚-4 --print '-4' return -4 end else begin commit transaction --事务提交-3 --print '-3' return -3 end END GO SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER OFF GO