0

我有一个项目来更新 SSRS 实例上的所有报告,并认为我会在 Excel 中获取所有报告的列表,这样我就可以在更新每个报告时勾选它们。容易,我想。我不经常(根本)不使用它,但 XML 似乎很适合这个。我会有类似的东西:

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

Catalog 表是我的数据源,它具有 ItemID 和 ParentID,因此我可以识别对象及其层次结构,但我无法以 XML 形式获取完整的服务器,如果我指定文件夹(名称或ItemID) 但不是整个服务器。一旦我取出 WHERE 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 的分离是有道理的!

有没有办法以 XML 形式获得完整的(最多 4 级)层次结构?

这是否与 XML 无关,而我走错了路,陷入了死胡同?

4

1 回答 1

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 ParentID=@ItemId
   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" />

坏消息是,如果不将“ReportTree”功能添加到您的 ReportServer 中,我不确定您是否可以做到这一点。因此,这取决于您对该服务器的访问权限。您也许可以让该功能跨数据库工作,我没有尝试过。

于 2009-06-19T13:49:45.197 回答