2009-06-19 3 views
0

У меня есть проект для обновления всех отчетов на экземпляре SSRS, и я думал, что получаю список всех отчетов в Excel, поэтому я могу отметить их, когда я обновляю каждый. Легко подумал я. Я не использую его часто (вообще), но XML, похоже, поддается этому. Я бы что-то вроде:XML для размещения содержимого папки

<Server> 
    <ReportFolder> 
    <ReportFolder> 
     <Report> 
     </Report> 
     <Report> 
     </Report> 
    </ReportFolder> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
    </ReportFolder> 
    <ReportFolder> 
    </ReportFolder> 
</Server> 

В таблице каталога был мой источник данных, он имеет ItemID и ParentID, так что я могу идентифицировать объекты и их иерархию, но я не могу получить полный сервер в виде XML, я могу получить содержимое одной папки, если я укажу папку (имя или ItemID), но не весь сервер. После того, как я вынимаю ГДЕ ItemID = 1234 строки я получаю что-то вроде:

<Server> 
    <ReportFolder> 
    </ReportFolder> 
    <ReportFolder> 
    </ReportFolder> 
    <ReportFolder> 
    </ReportFolder> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
</Server> 

Я попытался CTE-х XML AUTO, XML EXPLICIT и я теперь получаю чувствовать свою диссоциацию до сих пор с XML оправдан!

Есть ли способ получить полный (до 4 уровней) иерархии в форме XML?

Это что-то, что просто не имеет отношения к XML, и я принял неверный оборот в тупик?

+0

У вас есть пример набора строк? В настоящее время у меня нет настройки SSRS, поэтому у меня нет данных для пробных данных. Я бы подумал, что рекурсивный CTE отлично справится с этим. – ahains

ответ

0

Итак, хорошие новости и плохие новости. Вот хорошие новости.

CREATE FUNCTION [dbo].[GetReportTree](@ItemId uniqueidentifier) 
RETURNS XML 
BEGIN RETURN 
    (SELECT ca.ItemId AS '@ItemId', 
      ca.Name AS '@Name', 
      ca.Type AS '@Type', 
      dbo.GetReportTree(ca.ItemId) 
    FROM dbo.Catalog ca 
    WHERE (@ItemId IS NULL AND ParentId IS NULL) OR [email protected] 
    FOR XML PATH('CatalogItem'), TYPE) 
END 

SELECT dbo.[GetReportTree](NULL) 

Производит иерархию следующим образом:

<CatalogItem Name="" Type="1"> 
    <CatalogItem Name="ScrumTest" Type="1"> 
    <CatalogItem Name="(Hidden) Delta Report Small" Type="2" /> 
    <CatalogItem Name="(Hidden) Product Burndown Chart Small" Type="2" /> 
    <CatalogItem Name="(Hidden) Product Cumulative Flow Small" Type="2" /> 
    <CatalogItem Name="(Hidden) Sprint Burndown Chart Small" Type="2" /> 
    <CatalogItem Name="All Product Backlog Items" Type="2" /> 
    <CatalogItem Name="All Sprint Backlog Items" Type="2" /> 
    <CatalogItem Name="All Sprints" Type="2" /> 
    <CatalogItem Name="Current Sprint Status" Type="2" /> 
    <CatalogItem Name="Delta Report" Type="2" /> 
    <CatalogItem Name="Engineering Reports" Type="1"> 
     <CatalogItem Name="(Hidden) Bug History Chart Small" Type="2" /> 
     <CatalogItem Name="Bug Count" Type="2" /> 
     <CatalogItem Name="Bug History Chart" Type="2" /> 
     <CatalogItem Name="Bug Priority Chart" Type="2" /> 
    </CatalogItem> 
    <CatalogItem Name="Impediment Report" Type="2" /> 
    <CatalogItem Name="Product Backlog Composition" Type="2" /> 
    <CatalogItem Name="Product Burndown Chart" Type="2" /> 
    <CatalogItem Name="Product Cumulative Flow" Type="2" /> 
    <CatalogItem Name="Retrospective Report" Type="2" /> 

Плохая новость в том, что я не уверен, если вы можете сделать это без добавления функции «в» Дерево отчета вашей ReportServer. Таким образом, это зависит от вашего доступа к этому серверу. Возможно, вы сможете заставить функцию работать через базы данных, я не пробовал это.

+0

Darrel, Это идеальное решение, большое спасибо. Я, случается, DBA, поэтому я могу создать функцию, запустить скрипт и затем отбросить функцию, чтобы там не было проблемы! Джонатан – Fatherjack

Смежные вопросы