代码改变世界

SQLSERVER 数据调度示例,调度数据到中间表或者历史表

2017-10-19 10:39  newbirth  阅读(898)  评论(0编辑  收藏  举报
USE [MeiDongPay_Test]
GO
/****** Object:  StoredProcedure [dbo].[Job_BatchTransferOrderToMidst]    Script Date: 2017/10/19 10:37:41 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER
PROC [dbo].[Job_BatchTransferOrderToMidst]
AS
    SET NOCOUNT OFF    
    BEGIN
        DECLARE @MinID INT ,--最小值
            @MaxID INT ,--最大值
            @GoalID INT ,--上限
            @Step INT ,--步长
            @StartTime DATETIME ,--约束时间
            @CurrHour INT--当前小时数
        SET @CurrHour = DATEPART(hh, GETDATE())
		SELECT @CurrHour
		--当前小时限定只在指定时间段内处理数据
        IF ( @CurrHour >= 0 AND @CurrHour < 23)
            BEGIN
			--仅处理小于约束时间的数据
                SET @StartTime = CONVERT(VARCHAR(10), GETDATE(), 23)
                SELECT  @StartTime
			--获取最小值 最大值 上限值
                SELECT  @MinID = 0 ,
                        @MaxID = ( SELECT   MIN(ID)
                                   FROM     dbo.PayOrderInfo WITH ( NOLOCK )
                                   WHERE    SubmitTime < @StartTime
                                 ) ,
                        @GoalID = ( SELECT  MAX(ID)
                                    FROM    dbo.PayOrderInfo WITH ( NOLOCK )
                                    WHERE   SubmitTime < @StartTime
                                  ) ,
                        @Step = 3000
			--数据处理
                IF ( @MaxID <= @GoalID )
                    BEGIN
					--边界值修正
                        SET @MinID = @MaxID
                        SET @MaxID = @MinID + @Step
                        IF ( @MaxID > @GoalID )
                            SET @MaxID = @GoalID
					--启动事务
                        BEGIN TRAN
					--创建临时表
                        SELECT  *
                        INTO    #tempOrder
                        FROM    dbo.PayOrderInfo
                        WHERE   Id BETWEEN @MinID AND @MaxID
					--临时表数据插入历史表
                        INSERT  INTO PayOrderInfo_Midst
                                SELECT  *
                                FROM    #tempOrder
					--休眠一秒 ,大数据量度执行时休眠1s可以让cpu有机会创建其他命令
                        WAITFOR DELAY '00:00:01' 
					--源表删除已插入历史表的行
                        DELETE  FROM dbo.PayOrderInfo
                        WHERE   ID BETWEEN @MinID AND @MaxID
					--删除临时表				
                        DROP TABLE #tempOrder
					--事务提交
                        COMMIT TRAN
                    END
            END
    END