控制存储过程中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
相关产品推荐
相关产品推荐

