/*定期删除数据存储过程*/ CREATE PROCEDURE sp_DeleteOldData_Batch @BatchSize INT = 10000, -- 每批删除的行数 @DelayMs INT = 100 -- 每批之间的延迟(毫秒) AS BEGIN SET NOCOUNT ON; DECLARE @TotalDeleted INT; DECLARE @BatchDeleted INT; DECLARE @CutoffDate DATETIME; DECLARE @StartTime DATETIME; DECLARE @DelayTime VARCHAR(12); SET @CutoffDate = DATEADD(YEAR, -1, GETDATE()); SET @StartTime = GETDATE(); PRINT '开始删除一年前的数据,截止时间:' + CONVERT(VARCHAR, @CutoffDate, 120); BEGIN TRY -- ============ 删除 BlankingData ============ SET @TotalDeleted = 0; SET @BatchDeleted = 1; PRINT '开始删除 BlankingData 表数据...'; WHILE @BatchDeleted > 0 BEGIN DELETE TOP (@BatchSize) FROM dbo.BlankingData WHERE OutTime < @CutoffDate; SET @BatchDeleted = @@ROWCOUNT; SET @TotalDeleted = @TotalDeleted + @BatchDeleted; -- 每批之间短暂延迟,减少锁争用 IF @BatchDeleted > 0 AND @DelayMs > 0 BEGIN SET @DelayTime = '00:00:00.' + RIGHT('000' + CAST(@DelayMs AS VARCHAR(3)), 3); WAITFOR DELAY @DelayTime; END END PRINT 'BlankingData 表删除完成,共删除 ' + CAST(@TotalDeleted AS VARCHAR) + ' 行。'; -- ============ 删除 FeedingData ============ SET @TotalDeleted = 0; SET @BatchDeleted = 1; PRINT '开始删除 FeedingData 表数据...'; WHILE @BatchDeleted > 0 BEGIN DELETE TOP (@BatchSize) FROM dbo.FeedingData WHERE CreateTime < @CutoffDate; SET @BatchDeleted = @@ROWCOUNT; SET @TotalDeleted = @TotalDeleted + @BatchDeleted; IF @BatchDeleted > 0 AND @DelayMs > 0 BEGIN SET @DelayTime = '00:00:00.' + RIGHT('000' + CAST(@DelayMs AS VARCHAR(3)), 3); WAITFOR DELAY @DelayTime; END END PRINT 'FeedingData 表删除完成,共删除 ' + CAST(@TotalDeleted AS VARCHAR) + ' 行。'; -- ============ 删除 tb_alarm ============ SET @TotalDeleted = 0; SET @BatchDeleted = 1; PRINT '开始删除 tb_alarm 表数据...'; WHILE @BatchDeleted > 0 BEGIN DELETE TOP (@BatchSize) FROM dbo.tb_alarm WHERE EndTime < @CutoffDate; SET @BatchDeleted = @@ROWCOUNT; SET @TotalDeleted = @TotalDeleted + @BatchDeleted; IF @BatchDeleted > 0 AND @DelayMs > 0 BEGIN SET @DelayTime = '00:00:00.' + RIGHT('000' + CAST(@DelayMs AS VARCHAR(3)), 3); WAITFOR DELAY @DelayTime; END END PRINT 'tb_alarm 表删除完成,共删除 ' + CAST(@TotalDeleted AS VARCHAR) + ' 行。'; PRINT '所有表数据删除完成,总耗时:' + CAST(DATEDIFF(SECOND, @StartTime, GETDATE()) AS VARCHAR) + ' 秒。'; END TRY BEGIN CATCH PRINT '数据删除失败:' + ERROR_MESSAGE(); THROW; END CATCH END GO