Sql 嵌套文件夹内容的XML

Sql 嵌套文件夹内容的XML,sql,xml,hierarchy,Sql,Xml,Hierarchy,我有一个项目要更新SSRS实例上的所有报告,我想我会将所有报告的列表输入Excel,这样我可以在更新每个报告时勾选它们。我想很简单。我一点也不经常使用它,但XML似乎适合于此。我想要的是: <Server> <ReportFolder> <ReportFolder> <Report> </Report> <Report> </Report> &l

我有一个项目要更新SSRS实例上的所有报告,我想我会将所有报告的列表输入Excel,这样我可以在更新每个报告时勾选它们。我想很简单。我一点也不经常使用它,但XML似乎适合于此。我想要的是:

<Server>
  <ReportFolder>
    <ReportFolder>
      <Report>
      </Report>
      <Report>
      </Report>
    </ReportFolder>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>
  </ReportFolder>
  <ReportFolder>
  </ReportFolder>
</Server>
<Server>
  <ReportFolder>
  </ReportFolder>
  <ReportFolder>
  </ReportFolder>
  <ReportFolder>
  </ReportFolder>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>  
</Server>
目录表是我的数据源,它有ItemID和ParentID,因此我可以识别对象及其层次结构,但我无法以XML形式获取完整的服务器,如果我指定文件夹名称或ItemID而不是整个服务器,我可以获取一个文件夹的内容。一旦我取出WHERE ItemID=1234行,我会得到如下结果:

<Server>
  <ReportFolder>
    <ReportFolder>
      <Report>
      </Report>
      <Report>
      </Report>
    </ReportFolder>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>
  </ReportFolder>
  <ReportFolder>
  </ReportFolder>
</Server>
<Server>
  <ReportFolder>
  </ReportFolder>
  <ReportFolder>
  </ReportFolder>
  <ReportFolder>
  </ReportFolder>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>
    <Report>
    </Report>  
</Server>
我已经尝试过CTE的XML自动、XML显式,现在感觉到我与XML的分离是合理的

有没有一种方法可以以XML形式获取多达4个层次结构的完整信息


这是不是与XML无关,我走错了一条死胡同?

好消息和坏消息。这是好消息

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中,是否可以做到这一点。因此,这取决于您对该服务器的访问。您可以让函数跨数据库工作,我没有尝试过。

您有行的示例集吗?我目前没有SSRS设置,因此没有任何样本数据可供使用。我认为递归CTE可以很好地解决这个问题。Darrel,这很理想,非常感谢。我碰巧是DBA,所以我可以创建函数,运行脚本,然后删除函数,这样就没有问题了!乔纳森