Очень интересный вопрос. Как вы, без сомнения, обнаружили, что в результате поиска в базе данных 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'