Files
1440WGJ/数据库/TaskSchedule.sql
T

103 lines
3.4 KiB
Transact-SQL
Raw Normal View History

/*定期删除数据存储过程*/
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