定时执行sql

USE [zc_pro]
GO
/****** Object:  StoredProcedure [dbo].[PROC_DEAL_DATE_ZC]    Script Date: 2017/8/25 9:34:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[PROC_DEAL_DATE_ZC]
AS
BEGIN
    -- 定义当前时间
    DECLARE @CUR_DATE DATETIME;
    SET @CUR_DATE = GETDATE();
    -- 定义众采活动ID
    DECLARE @GBIID INT;
    -- 定义实际、额定、最低参团人数
    DECLARE @FACTNUM INT;
    DECLARE @RATENUM INT;
    DECLARE @MINNUM INT;
    /**********************************************************************
    ***************----------未处理的众采----------************************
    ***********************************************************************/
    -- 情况一:处理已达到定金支付截止日期的众采活动 
    --([dbo].[GroupBuy_Info].[Status] = 10 @CUR_DATE >= [dbo].[GroupBuy_Info].[DepositEndTime])
    -- 众采活动状态:定金阶段 并且 当前时间大于定金支付截止时间
    -- 定义游标
    DECLARE CURSOR_DEPOSIT CURSOR SCROLL FOR
    SELECT [GroupBuyInfoID],[RegulationsCount],[MinRegulationsCounts] FROM zc_pro.DBO.GroupBuy_Info WHERE [Status] = 10 AND [DepositEndTime] <= @CUR_DATE;
    -- 打开游标
    OPEN CURSOR_DEPOSIT;
    FETCH NEXT FROM CURSOR_DEPOSIT INTO @GBIID,@RATENUM,@MINNUM;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        -----------------------------------------------------------------------------------------------------------------------
        -----------------------------------处理已达到定金截止日期的众采活动----------------------------------------------------
        -- 获得实际参与人数
        -- 实际参与人数为 【众采参与表】中,状态为已支付定金状态的数据;申请定金退款状态不在此列;
        SELECT @FACTNUM = COUNT([AddGroupBuyInfoID]) FROM zc_pro.dbo.Add_Group_Buy_Info WHERE [AddGroupStatus] = 10;

        IF @FACTNUM = 0
        BEGIN
            -- 没有一个人支付定金,则标记众采活动为失败
            UPDATE zc_pro.DBO.GroupBuy_Info SET [Status] = -10 WHERE [GroupBuyInfoID] = @GBIID;
        END
        ELSE IF @FACTNUM > 0 AND @FACTNUM < @MINNUM
        BEGIN
            -- 支付定金的人数大于0,并且小于最低成团人数时,则标记众采活动为失败
            UPDATE zc_pro.DBO.GroupBuy_Info SET [Status] = -10 WHERE [GroupBuyInfoID] = @GBIID;
            -- 同时标记已支付定金的状态为【团购失败需退定金】
            UPDATE zc_pro.dbo.Add_Group_Buy_Info SET AddGroupStatus = -30 WHERE [GroupBuyInfoID] = @GBIID;
            -- 涉及到的短信类型
            -- 众采活动失败通知(退定金提示)
            INSERT INTO zc_pro.dbo.NeedSendMsg    
            SELECT TB.UserInfoID, TB.Phone, @GBIID AS GBID,'失败需退定金' AS MSGTYPE, dbo.MSGDATE() AS AFTERDATE, 0 ISSEND, GETDATE() ADDDATE  
            FROM zc_pro.dbo.Add_Group_Buy_Info TA 
            LEFT JOIN zc_pro.dbo.User_Info TB ON TA.UserInfoID = TB.UserInfoID 
            WHERE TA.GroupBuyInfoID = @GBIID AND TB.IsFictitiousUser = 1 AND TA.AddGroupStatus = 10;
        END
        ELSE IF @FACTNUM >= @MINNUM AND @FACTNUM < @RATENUM
        BEGIN
            -- 支付定金的人数大于等于最低成团人数,并且小于额定成团人数时,则标记众采活动为尾款阶段
            UPDATE zc_pro.DBO.GroupBuy_Info SET [Status] = 20 WHERE [GroupBuyInfoID] = @GBIID;
            -- 增加虚拟参团人员,以达到指定人数
            DECLARE @NEED_USER_NUM INT;
            SET @NEED_USER_NUM = @RATENUM - @FACTNUM;
            INSERT INTO zc_pro.dbo.Add_Group_Buy_Info
                    ( GroupBuyInfoID ,
                      UserInfoID ,
                      AddTime ,
                      IsFictitiousUser ,
                      IsPayDeposit ,
                      PayDepositPrice ,
                      PayDepositTime ,
                      IsPayRetainage ,
                      PayRetainagePrice ,
                      PayRetainageTime ,
                      ApplyRefundTime ,
                      AddGroupStatus
                    )
            SELECT TOP (@NEED_USER_NUM) @GBIID,[UserInfoID],GETDATE() AS [AddTime], 0 AS [IsFictitiousUser], 
            1 AS [IsPayDeposit], 0 AS [PayDepositPrice], DATEADD(SECOND,-185,GETDATE()) AS [PayDepositTime], 
            0 AS [IsPayRetainage], 0 AS [PayRetainagePrice], NULL AS [PayRetainageTime], NULL AS [ApplyRefundTime], 
            10 AS [AddGroupStatus]
            FROM zc_pro.DBO.User_Info WHERE IsFictitiousUser = 0 ORDER BY NEWID();
            -- 涉及到的短信类型
            -- 众采活动成功通知(支付尾款提示)
            INSERT INTO zc_pro.dbo.NeedSendMsg    
            SELECT TB.UserInfoID, TB.Phone, @GBIID AS GBID,'成功需支付尾款' AS MSGTYPE, dbo.MSGDATE() AS AFTERDATE, 0 ISSEND, GETDATE() ADDDATE  
            FROM zc_pro.dbo.Add_Group_Buy_Info TA 
            LEFT JOIN zc_pro.dbo.User_Info TB ON TA.UserInfoID = TB.UserInfoID 
            WHERE TA.GroupBuyInfoID = @GBIID AND TB.IsFictitiousUser = 1 AND TA.AddGroupStatus = 10;
        END
        ELSE IF @FACTNUM = @RATENUM
        BEGIN
            -- 当实际参与人数等于额定人数时,标记众采活动状态为【尾款阶段】
            UPDATE zc_pro.DBO.GroupBuy_Info SET [Status] = 20 WHERE [GroupBuyInfoID] = @GBIID;
            -- 涉及到的短信类型
            -- 众采活动成功通知(支付尾款提示)
            INSERT INTO zc_pro.dbo.NeedSendMsg    
            SELECT TB.UserInfoID, TB.Phone, @GBIID AS GBID,'成功支付尾款' AS MSGTYPE, dbo.MSGDATE() AS AFTERDATE, 0 ISSEND, GETDATE() ADDDATE  
            FROM zc_pro.dbo.Add_Group_Buy_Info TA 
            LEFT JOIN zc_pro.dbo.User_Info TB ON TA.UserInfoID = TB.UserInfoID 
            WHERE TA.GroupBuyInfoID = @GBIID AND TB.IsFictitiousUser = 1 AND TA.AddGroupStatus = 10;
        END
        
        

        FETCH NEXT FROM CURSOR_DEPOSIT INTO @GBIID,@RATENUM,@MINNUM;
        -----------------------------------------------------------------------------------------------------------------------
    END
    -- 关闭并释放游标
    CLOSE CURSOR_DEPOSIT;
    DEALLOCATE CURSOR_DEPOSIT;

    -- 情况二:处理已达到尾款截止日期的众采活动 
    --([dbo].[GroupBuy_Info].[Status] = 20 @CUR_DATE >= [dbo].[GroupBuy_Info].[RetainageStartTime])
    -- 众采活动状态:尾款阶段 并且 当前时间大于尾款截止日期
    DECLARE CURSOR_TAIL CURSOR SCROLL FOR
    SELECT [GroupBuyInfoID] FROM zc_pro.DBO.GroupBuy_Info WHERE [Status] = 20 AND [RetainageStartTime] <= @CUR_DATE;

    OPEN CURSOR_TAIL;
    FETCH NEXT FROM CURSOR_TAIL INTO @GBIID;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        -----------------------------------------------------------------------------------------------------------------------
        -----------------------------------处理已达到尾款截止日期的众采活动----------------------------------------------------
        -- 标记众采活动为尾款统筹阶段
        UPDATE zc_pro.DBO.GroupBuy_Info SET [Status] = 40 WHERE GroupBuyInfoID = @GBIID;
        FETCH NEXT FROM CURSOR_TAIL INTO @GBIID;
        -----------------------------------------------------------------------------------------------------------------------
    END
    CLOSE CURSOR_TAIL;
    DEALLOCATE CURSOR_TAIL;

    -- 情况三:处理已达到指标截止日期的众采活动
    --([dbo].[GroupBuy_Info].[Status] = 30 @CUR_DATE >= [dbo].[GroupBuy_Info].[RetainageEndTime])
    -- 众采活动状态:指标阶段 并且 当前时间大于指标截止日期
    DECLARE CURSOR_QUOTA CURSOR SCROLL FOR
    SELECT [GroupBuyInfoID] FROM zc_pro.DBO.GroupBuy_Info WHERE [Status] = 30 AND [RetainageEndTime] <= @CUR_DATE;

    OPEN CURSOR_QUOTA;
    FETCH NEXT FROM CURSOR_QUOTA INTO @GBIID;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        -----------------------------------------------------------------------------------------------------------------------
        -----------------------------------处理已达到指标支付截止日期的众采活动------------------------------------------------
        -- 标记众采活动为指标统筹阶段;
        UPDATE zc_pro.DBO.GroupBuy_Info SET [Status] = 60 WHERE GroupBuyInfoID = @GBIID;
        FETCH NEXT FROM CURSOR_QUOTA INTO @GBIID;
        -----------------------------------------------------------------------------------------------------------------------
    END
    CLOSE CURSOR_QUOTA;
    DEALLOCATE CURSOR_QUOTA;

END
原文地址:https://www.cnblogs.com/xhyang/p/7426507.html