Domanda

Ho un progetto per aggiornare tutti i report su un'istanza SSRS e ho pensato di ottenere un elenco di tutti i report in Excel in modo da poterli spuntare mentre aggiorno ognuno. Facile ho pensato. Non lo uso spesso (per niente) ma XML sembra prestarsi a questo. Vorrei qualcosa del tipo:

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

La tabella del catalogo è stata la mia fonte di dati, ha ItemID e ParentID in modo da poter identificare gli oggetti e la loro gerarchia ma non riesco a ottenere il server completo in formato XML, posso ottenere il contenuto di una cartella, se specifico la cartella (nome o ItemID) ma non l'intero server. Una volta eliminato l'elemento WHERE ItemID = 1234 ottengo qualcosa del tipo:

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

Ho provato XML AUTO, XML EXPLICIT di CTE e ora riesco a sentire la mia dissociazione finora con XML è giustificata!

C'è un modo per ottenere l'intero (fino a 4 livelli) della gerarchia in formato XML?

È qualcosa che non è rilevante per XML e ho preso una svolta sbagliata in un vicolo cieco?

È stato utile?

Soluzione

Quindi, buone e cattive notizie. Ecco la buona notizia.

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)   

Produce una gerarchia come questa:

<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" />

La cattiva notizia è che non sono sicuro che tu possa farlo senza aggiungere il " ReportTree " nel tuo ReportServer. Quindi, dipende dal tuo accesso a quel server. Potresti riuscire a far funzionare la funzione su più database, non l'ho provato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top