我需要获取特定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
答案 0 :(得分:0)
首先-我不会直接查询ReportServer.dbo.Catalog。人们一直在这样做,这很疯狂。将img数据转换为VARNBINARY(MAX),然后转换为XML极其昂贵。 如果您经常需要此信息,建议您将此查询的结果转储到另一个表中 (我们将其称为“ SSRS_RDL”),作为报告部署过程的一部分您将根据需要使用更改和新记录更新SSRS_RDL。即使是一个小时的工作就足够了。这样,您处理的关系数据易于索引,并且比现在的处理速度快1000倍。
这表示您的代码存在严重的设计缺陷;你是:
您可以摆脱@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()。)