SSRS多选参数场景下循环执行存储过程合并结果集的问题咨询
解决方案
方案1:SQL侧实现(适合需合并所有存储过程返回结果做聚合计算/统一导出的场景)
核心逻辑是先把SSRS传入的多选参数(默认是逗号分隔的ID字符串)拆分为行存储,再遍历每个ID调用存储过程合并结果。
首先修正你现有代码的已知bug:循环内重复写了两次SET @i = @i + 1,会导致每次循环跳过一个ID,直接删除多余的那行即可。
修正后的完整代码如下:
-- 存储过程结果接收表,结构要和存储过程返回的结构完全一致 DECLARE @MyTempTable TABLE (txtType NVARCHAR(20), intID integer, txtAccountCode NVARCHAR(50), txtSchoolID NVARCHAR(50), txtSageCode NVARCHAR(50), ChargeCode NVARCHAR(50), txtDescription NVARCHAR(200), mAmount DECIMAL(18,2), percentageAmount DECIMAL(18,2), txtChargeType NVARCHAR(50), txtNominalAccount NVARCHAR(50), bBilledInAdvance BIT) DECLARE @i int DECLARE @CycleId int DECLARE @numrows int DECLARE @Cycle Table ( idx smallint IDENTITY(1,1) , CycleId int ) -- 拆分SSRS传入的多选参数@intCycleId(逗号分隔字符串)为行,SQL Server 2016及以上可用STRING_SPLIT INSERT @Cycle (CycleId) SELECT CAST(value AS INT) FROM STRING_SPLIT(@intCycleId, ',') /* 低版本SQL Server没有STRING_SPLIT的话,自行实现一个拆分函数,替换上面的INSERT逻辑即可,拆分函数示例逻辑: CREATE FUNCTION dbo.SplitIntList (@List NVARCHAR(MAX), @Delimiter CHAR(1)) RETURNS @Result TABLE (Value INT) AS BEGIN DECLARE @Value NVARCHAR(MAX) WHILE CHARINDEX(@Delimiter, @List) > 0 BEGIN SET @Value = SUBSTRING(@List, 1, CHARINDEX(@Delimiter, @List) - 1) INSERT INTO @Result (Value) VALUES (CAST(@Value AS INT)) SET @List = SUBSTRING(@List, CHARINDEX(@Delimiter, @List) + 1, LEN(@List)) END INSERT INTO @Result (Value) VALUES (CAST(@List AS INT)) RETURN END -- 调用:SELECT Value FROM dbo.SplitIntList(@intCycleId, ',') */ SET @i = 1 SET @numrows = (SELECT COUNT(*) FROM @Cycle) IF @numrows > 0 WHILE (@i <= @numrows) BEGIN SET @CycleId = (SELECT CycleId FROM @Cycle WHERE idx = @i) INSERT INTO @MyTempTable EXEC usp_cust_GetTransactionsByCycle @CycleId -- 删掉原来重复的自增,保留一次即可 SET @i = @i + 1 END -- 最后直接查询临时表即可拿到所有ID对应的合并结果 SELECT * FROM @MyTempTable
方案2:SSRS侧实现(适合不需要聚合所有结果、仅需逐个展示每个ID对应数据的场景)
不需要修改SQL逻辑,直接用SSRS原生组件实现遍历:
- 先创建子报表,设置单个
CycleID参数,数据集直接调用usp_cust_GetTransactionsByCycle存储过程,传入单个CycleID参数,完成单ID下的报表样式开发 - 主报表保留原有的多选
CycleID参数,新增一个专门的参数拆分数据集,查询语句写:SELECT CAST(value AS INT) AS CycleID FROM STRING_SPLIT(@intCycleId, ',') - 主报表画布拖入「列表」控件,绑定该拆分数据集,列表的行组设置为按
CycleID字段分组 - 列表内部嵌入开发好的子报表,子报表的
CycleID参数绑定当前列表行的CycleID字段
运行后主报表会自动遍历所有选中的ID,逐个调用子报表渲染对应结果。
内容的提问来源于stack exchange,提问作者Craig.C
相关产品推荐
相关产品推荐

