在 SSRS 中,我通过调用调用子存储过程等的存储过程来创建数据集。有 4 个嵌套存储过程。每个调用存储过程都有一个参数,以避免显示数据,而是将其嵌入到全局临时表中。这允许我仅显示父存储过程中的数据。
即使担心存储过程中的依赖关系问题,我也会这样做,以便我可以:
- 重用存储过程逻辑,因为每个父存储过程都基于子存储过程中的数据构建
- 根据我调用的嵌入式子存储过程检索不同类型的数据。
- 避免重复相同的逻辑,因为每个存储过程都基于其子存储过程构建
例如:
DECLARE @SqlString NVARCHAR(2000)
DECLARE @ParamDef NVARCHAR(2000)
SET @SqlString = N'EXEC ClaimantFinancePaymentCategories @param1'
SET @ParamDef = N'@param1 int'
EXECUTE sp_executesql @SqlString ,@ParamDef, @param1 = 1 -- view the data
存储过程ClaimantFinancePaymentCategories
调用另一个嵌套存储过程:
DECLARE @SqlString NVARCHAR(2000)
DECLARE @ParamDef NVARCHAR(2000)
SET @SqlString = N'EXEC ClaimantFinancePaymentSubCategories @param1'
SET @ParamDef = N'@param1 int'
EXECUTE sp_executesql @SqlString ,@ParamDef, @param1 = 0 -- view the data
等等。在 SSRS 中,当我运行"查询设计器"时,将返回父数据集,但是当父存储过程只有一个嵌入式存储过程时,SSRS 会显示父存储过程中的数据列。
遗憾的是,在调用 2 个嵌套子存储过程后,SSRS 显示嵌入最多的子存储过程中的数据列,而不是父存储过程中的数据列。
我尝试在嵌入式子存储过程中使用用户定义的表而不是全局临时表返回数据,但我得到了相同的结果。
有什么建议吗?
在报表数据集中,可以使用正确的列声明临时表。将父存储过程的结果插入其中,如下所示:
INSERT INTO #tempTable
EXECUTE sp_executesql @SqlString ,@ParamDef, @param1 = 1
然后从临时表中选择 *。这将允许报表填充正确的列。