You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存储过程未按预期执行数据删除操作求助

问题描述

我编写了一个用于删除数据的存储过程,执行时系统提示“Command completed successfully”,但实际旧数据并未被删除。我添加了判断存储过程是否存在的语句,这部分可以正常生效,但存储过程内的删除逻辑始终未实际执行。以下是我的代码:

USE SkillTracking;
GO

IF object_id('spDataDeletion') IS NULL
    EXEC ('create procedure dbo.spDataDeletion as select 1')
GO

ALTER PROCEDURE spDataDeletion
AS 
BEGIN
    -- 创建临时表存储每个员工的最新记录用于子查询
    CREATE TABLE #LatestEmployeeRecords 
    (
        LogID INT IDENTITY(1,1) PRIMARY KEY,
        HIST_EMP_IFXID varchar(10),
        HIST_AS_CURR_SESS NVARCHAR(100),
        RECORDS_DELETED INT,
        HIST_AS_DATE_UPDATE DATE,
        DELETION_DATE DATE,
        TIMESTAMP DATETIME
    );

    DECLARE @DELETION_DATE DATE = CAST(GETDATE() AS DATE);
    DECLARE @TIMESTAMP DATETIME;
    SELECT @TIMESTAMP = CURRENT_TIMESTAMP

    -- 向临时表插入数据
    INSERT INTO #LatestEmployeeRecords (HIST_EMP_IFXID, HIST_AS_CURR_SESS, RECORDS_DELETED, HIST_AS_DATE_UPDATE, DELETION_DATE, TIMESTAMP)
        SELECT 
            HIST_EMP_IFXID, HIST_AS_CURR_SESS, RECORDS_DELETED, 
            HIST_AS_DATE_UPDATE, @DELETION_DATE, @TIMESTAMP
        FROM  
            (SELECT 
                 HIST_EMP_IFXID, HIST_AS_CURR_SESS, 
                 COUNT(*) AS RECORDS_DELETED, HIST_AS_DATE_UPDATE
             FROM  
                 [dbo].[tblHistoryBackup] 
             WHERE 
                 HIST_AS_DATE_UPDATE < DATEADD(MONTH, -36, @DELETION_DATE)
             GROUP BY 
                 HIST_EMP_IFXID, HIST_AS_CURR_SESS, HIST_AS_DATE_UPDATE) t;

    IF (SELECT COUNT(*) FROM #LatestEmployeeRecords) = 0
    BEGIN
        DECLARE @Message NVARCHAR(4000) = '所有记录均为最新状态。'
            
        -- 插入日志
        INSERT INTO [dbo].[tblLog] (TimeStamp, EventType, Details, IsError)
        VALUES (@TIMESTAMP, '无记录需要删除', @Message, 0);
    END
    ELSE
    BEGIN
        DECLARE @RECORDS_DELETED INT;

        SELECT @RECORDS_DELETED =  SUM(RECORDS_DELETED) 
        FROM #LatestEmployeeRecords

        DECLARE @Message2 NVARCHAR(4000) =  '删除成功。从tblHistoryBackup表共删除 ' + CAST(@RECORDS_DELETED AS NVARCHAR(10)) + ' 条记录';
         
        -- 插入日志
        INSERT INTO [dbo].[tblLog] (TimeStamp, EventType, Details, IsError)
        VALUES (@TIMESTAMP, '删除完成', @Message2, 0);
    END

    DECLARE @DELETION_DATE2 DATE = CAST(GETDATE() AS DATE);
    -- 删除tblHistoryBackup表中的旧数据
    DELETE FROM [dbo].[tblHistoryBackup]
    WHERE HIST_AS_DATE_UPDATE < DATEADD(MONTH, -36, @DELETION_DATE2)

    -- 将删除记录插入日志表
    INSERT INTO [dbo].[tblLog_Data_Deletion](LogID, HIST_EMP_IFXID, HIST_AS_CURR_SESS, RECORDS_DELETED, HIST_AS_DATE_UPDATE, DELETION_DATE, TimeStamp)
        SELECT 
            LogID, HIST_EMP_IFXID, HIST_AS_CURR_SESS, RECORDS_DELETED, 
            HIST_AS_DATE_UPDATE, DELETION_DATE, TIMESTAMP
        FROM 
            #LatestEmployeeRecords;

    -- 删除临时表
    DROP TABLE #LatestEmployeeRecords;
END
排查与解决步骤
  • 验证筛选条件是否存在符合的数据
    手动执行以下SQL,确认是否存在36个月前的待删除记录:

    SELECT * FROM [dbo].[tblHistoryBackup] 
    WHERE HIST_AS_DATE_UPDATE < DATEADD(MONTH, -36, CAST(GETDATE() AS DATE))
    

    如果返回空结果,说明没有符合删除条件的数据,这是删除操作无效果的核心原因。

  • 检查日志表确认执行分支
    查看tblLog表,如果存在“无记录需要删除”的日志,说明临时表未插入数据,删除逻辑确实没有可操作的对象。

  • 添加删除行数验证
    在DELETE语句后添加日志,记录实际删除的行数,方便直接验证操作效果:

    DECLARE @ActualDeletedRows INT = @@ROWCOUNT;
    INSERT INTO [dbo].[tblLog] (TimeStamp, EventType, Details, IsError)
    VALUES (CURRENT_TIMESTAMP, '删除执行详情', '实际删除行数: ' + CAST(@ActualDeletedRows AS NVARCHAR(10)), 0);
    
  • 确保存储过程是最新版本
    执行以下语句重新编译存储过程,避免会话缓存导致的旧版本执行:

    EXEC sp_recompile 'spDataDeletion';
    
  • 验证权限
    确认执行存储过程的账号对tblHistoryBackup表拥有DELETE权限,权限不足也可能导致删除操作无实际效果。

内容的提问来源于stack exchange,提问作者mhgg00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:25:19