增加"定时删除数据库S1270一年以上数据"

This commit is contained in:
liming 蔡
2026-07-28 09:59:42 +08:00
parent af014ed33c
commit 799fb8ff06
4 changed files with 122 additions and 0 deletions
Binary file not shown.
+103
View File
@@ -0,0 +1,103 @@
/*定期删除数据存储过程*/
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
+14
View File
@@ -0,0 +1,14 @@
@echo off
:: 设置日志文件路径
set LOGFILE=D:\BatLogs\DeleteOldData_%date:~0,4%%date:~5,2%%date:~8,2%.log
:: 如果 D:\BatLogs 目录不存在,则创建
if not exist "D:\BatLogs" mkdir "D:\BatLogs"
sqlcmd -S .\SQLEXPRESS -d S1270 -E -Q "EXEC sp_DeleteOldData_Batch" >> "%LOGFILE%"
echo. >> "%LOGFILE%"
exit /b %ERRORLEVEL%
pause
+5
View File
@@ -0,0 +1,5 @@
定时删除数据库S1270一年以上的数据
1. 根据文件TaskSchedule.sql创建删除数据存储过程
2. 在D盘创建文件夹MyBat, 存放sqlSchedule.bat
3. 打开windows的任务计划程序,导入DeepSeaDeleteSchedule.xml
4. 运行DeepSeaDeleteSchedule,查看D:\BatLogs中的日志,验证定时删除是否正常