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

控制存储过程中RTTReportHelper表的清空逻辑问题

解决方案

要解决三次执行SelectHeadlineData后仅保留最后一次数据的问题,核心是调整表清空逻辑,区分单次执行和批量执行场景,同时确保不同@ReportType的数据能共存。以下是具体实现步骤:

1. 调整表结构(若未包含)

首先确保RTTReportHelper表包含ReportType字段,用于区分不同类型的报表数据:

ALTER TABLE dbo.RTTReportHelper 
ADD ReportType int NOT NULL DEFAULT 0;

2. 修改SelectHeadlineData存储过程

新增一个批量执行标识参数,精准控制清空范围:

CREATE PROCEDURE [dbo].[SelectHeadlineData]
    @StartDate datetime,
    @EndDate datetime,
    @ReportType int = 0,
    @Username varchar(100),
    @IsPartOfBatch bit = 0 -- 新增:0=单次执行,1=三次批量执行
AS
    -- 根据执行模式决定清空逻辑
    IF @IsPartOfBatch = 0
    BEGIN
        -- 单次执行:清空当前用户所有旧数据
        DELETE FROM dbo.RTTReportHelper 
        WHERE Username = @Username;
    END
    ELSE
    BEGIN
        -- 批量执行:仅清空当前用户下本次ReportType的旧数据(避免覆盖其他类型)
        DELETE FROM dbo.RTTReportHelper 
        WHERE Username = @Username AND ReportType = @ReportType;
    END

    -- 填充对应类型的新数据
    EXEC dbo.PopulateRTTReportHelper @StartDate, @EndDate, @ReportType, @Username;

    -- 返回当前用户的所有报表数据
    SELECT * 
    FROM dbo.RTTReportHelper 
    WHERE Username = @Username;

注意:需要同步修改PopulateRTTReportHelper存储过程,确保插入数据时将@ReportType值写入RTTReportHelper的ReportType字段。

3. 调整页面调用逻辑

  • 单次执行场景(@ReportType=0或1):直接调用SelectHeadlineData,无需传@IsPartOfBatch(默认0),自动清空当前用户所有旧数据。
  • 三次批量执行场景(依次传@ReportType=1、2、3):每次调用都传入@IsPartOfBatch=1,执行后RTTReportHelper会保留该用户的三种类型数据:
    • 第一次调用:清空并插入ReportType=1的数据;
    • 第二次调用:清空并插入ReportType=2的数据;
    • 第三次调用:清空并插入ReportType=3的数据;

4. 优化钻取存储过程(可选)

为了精准查询对应表头的钻取数据,给SelectDrilldownData新增@ReportType参数:

CREATE PROCEDURE [dbo].[SelectDrilldownData]
    @Username varchar(100),
    @ReportType int -- 新增:指定要钻取的报表类型
AS
    SELECT * 
    FROM dbo.RTTReportHelper 
    WHERE Username = @Username AND ReportType = @ReportType;

页面点击超链接时,传入对应行的ReportType值即可获取匹配的钻取数据。

替代方案(无需新增参数)

如果无法新增参数,可通过检查当前用户已有数据判断执行模式(可靠性稍弱,依赖数据状态):

CREATE PROCEDURE [dbo].[SelectHeadlineData]
    @StartDate datetime,
    @EndDate datetime,
    @ReportType int = 0,
    @Username varchar(100)
AS
    DECLARE @IsBatchExecution bit = 0;

    -- 检查当前用户是否已有其他批量类型数据,判断是否为批量执行
    IF EXISTS (SELECT 1 FROM dbo.RTTReportHelper WHERE Username = @Username AND ReportType IN (2,3))
    BEGIN
        SET @IsBatchExecution = 1;
    END

    IF @IsBatchExecution = 0 AND @ReportType IN (0,1)
    BEGIN
        -- 单次执行:清空所有数据
        DELETE FROM dbo.RTTReportHelper WHERE Username = @Username;
    END
    ELSE
    BEGIN
        -- 批量执行:仅清空当前ReportType的数据
        DELETE FROM dbo.RTTReportHelper WHERE Username = @Username AND ReportType = @ReportType;
    END

    EXEC dbo.PopulateRTTReportHelper @StartDate, @EndDate, @ReportType, @Username;

    SELECT * FROM dbo.RTTReportHelper WHERE Username = @Username;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:24:56