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