2016-12-21 4 views
1

Я знаком с запросами к базе данных ReportServer, чтобы найти список отчетов, но мне нужно что-то более приспособленное для поиска отчетов родитель-младшего списка или, по крайней мере, дочернего отчеты. У меня есть отчет SSRS, выход которого, как это:Как запросить SQL Server ReportServer для поиска родительских дочерних отчетов

parent report output

Когда пользователь нажимает на ссылку, второй ребенок .rdl выполняется.

Мне нужен запрос, который я могу запустить, чтобы определить ссылку отчетов, содержащих ребенка.

ответ

0

Очень интересный вопрос. Как вы, без сомнения, обнаружили, что в результате поиска в базе данных ReportServer каждый объект на сервере представлен строкой в ​​таблице каталога, однозначно идентифицируемой ItemID. И, как вы, несомненно, нашли, нет никакой связи между одним элементом каталога и другим. Таким образом, вы не можете написать регулярную инструкцию SQL, чтобы запросить сквозной/отчетный отчет (ы) отчета.

Отчет только знает, какие подзаголовки загружаются при обработке RDL. Таким образом, чтобы получить данные древовидного/субрепортажа, нам нужно изучить RDL (это действительно просто XML). Это сохраняется в столбце «Содержимое» таблицы «Каталог».

Этот бит SQL должен вас запустить.

with xmlnamespaces ('http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition' as rdl), 
CatalogData as (
select ItemID, [Path], [Name], Content, convert(xml, convert(varbinary(max), Content)) 'ContentXml' 
from [Catalog] 
where [Type] = 2) 
select ItemID, [Path], [Name], ContentXml, s.value('rdl:ReportName[1]', 'nvarchar(256)') 
from CatalogData 
cross apply ContentXml.nodes('//rdl:Drillthrough') as Subreports(s); 

Несколько пунктов отметить:

  • Двойной новообращенный по содержанию как колонного типа является изображение
  • Использование пространства имен XML reportdefintion. Вам нужно будет изучить XML, сгенерированный с вашего собственного сервера отчетов, и, при необходимости, заменить его
  • xquery на крест-соединении является потомком из корня xml. Это связано с тем, что тег «Drillthrough» может встречаться где угодно. Очевидно, это повлияет на время выполнения, особенно если у вас много отчетов на вашем сервере. Поэтому вы можете добавить предложение where, ограничивающее путь.
  • Вы можете найти Subreports, изменив cross join xquery на '// rdl: Subreport'
Смежные вопросы