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