查询以获取SSRS报告参数和下拉选项缓慢

时间:2019-05-15 17:39:12

标签: sql tsql ssrs-2012

我需要获取特定SSRS报告的参数列表,并显示所有可能的下拉菜单项(以及Report参数名称,DataType和Prompt)。

我不确定其他选项(如果有)。该查询恰好返回了我需要的内容,只是花了太长时间才有用(10-12秒)。是否有另一种方法来获得这些结果或使结果更快?

USE ReportServer
DECLARE @dbname VARCHAR(25)
SET @dbname='DBName'
DECLARE @rptlistStr VARCHAR(MAX)
DECLARE @reportlist table ( path varchar(500), name varchar(500) )
insert into @reportlist
exec [ADA Master].[dbo].[spGetAdminReports] @dbname

set @rptlistStr = substring((SELECT ( ', ' + Name ) FROM @reportlist WHERE NAME = 'rptReport'
FOR XML PATH( '' )
), 3, 1000 )          


SELECT NAME, PATH,
y.r.query ('for $s in *:ParameterValue/*:Value return concat(data($s),"|")') [DropDownItemValue]    
, y.r.query ('for $s in *:ParameterValue/*:Label return concat(data($s),"|")') [DropDownItemLabel]      
, x.r.value ('@Name', 'VARCHAR(100)') AS ReportParameterName
, x.r.value ('*:DataType[1]', 'VARCHAR(100)') AS DataType
, x.r.value ('*:AllowBlank[1]', 'VARCHAR(50)') AS AllowBlank
, x.r.value ('*:Prompt[1]', 'VARCHAR(100)') AS Prompt
, x.r.value ('*:Hidden[1]', 'VARCHAR(100)') AS Hidden
, x.r.value ('*:MultiValue[1]', 'VARCHAR(100)') AS MultiValue
FROM (
SELECT  PATH
, NAME
, CAST(CAST(content AS VARBINARY(MAX)) AS XML) AS ReportXML 
FROM ReportServer.dbo.Catalog 
join master.dbo.ufn_SplitStringArray(@rptlistStr,',') a on NAME COLLATE DATABASE_DEFAULT = a.Item COLLATE DATABASE_DEFAULT
WHERE CONTENT IS NOT NULL AND TYPE = 2
) C
CROSS APPLY C.ReportXML.nodes('*:Report/*:ReportParameters/*:ReportParameter') x(r) 
OUTER APPLY x.r.nodes('*:ValidValues/*:ParameterValues') y(r) 
where x.r.value ('*:Prompt[1]', 'VARCHAR(100)') is not null 

1 个答案:

答案 0 :(得分:0)

首先-我不会直接查询ReportServer.dbo.Catalog。人们一直在这样做,这很疯狂。将img数据转换为VARNBINARY(MAX),然后转换为XML极其昂贵。 如果您经常需要此信息,建议您将此查询的结果转储到另一个表中 (我们将其称为“ SSRS_RDL”),作为报告部署过程的一部分您将根据需要使用更改和新记录更新SSRS_RDL。即使是一个小时的工作就足够了。这样,您处理的关系数据易于索引,并且比现在的处理速度快1000倍。

这表示您的代码存在严重的设计缺陷;你是:

  1. 执行[ADA Master]。[dbo]。[spGetAdminReports]将行推送到您的@reportlist表中
  2. 然后使用XML PATH将@reportlist转换为名为@rptlistStr的字符串
  3. 然后使用dbo.ufn_SplitStringArray将@rptlistStr转换回表中
  4. 将此表的结果加入ReportServer.dbo.Catalog

您可以摆脱@rptlistStr以及从@reportList填充它的代码,而将@reportlist表连接到ReportServer.dbo.Catalog。换句话说,更改:

FROM ReportServer.dbo.Catalog AS c
JOIN master.dbo.ufn_SplitStringArray(@rptlistStr,',') a on NAME COLLATE DATABASE_DEFAULT = a.Item COLLATE DATABASE_DEFAULT

收件人:

FROM ReportServer.dbo.Catalog AS c
JOIN @reportlist AS a ON on c.Name COLLATE DATABASE_DEFAULT = a.name COLLATE DATABASE_DEFAULT

最后:

使用并行执行计划,此查询将运行得更快。做出更改后,我只概述一下最终的SELECT查询结束时使用OPTION (QUERYTRACEON 8649)(或使用Adam Machanic的Make_Parallel()。)