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> 

カタログ・テーブルがデータの私の元になった、それはので、私は、オブジェクトとその階層をアイテムIDとのParentIDを識別することができましたが、私はXML形式で完全なサーバーを取得することはできませんが、私は得ることができます私はフォルダ(名前またはItemID)を指定しても、サーバー全体ではない場合、1つのフォルダの内容。

私が試してみました
<Server> 
    <ReportFolder> 
    </ReportFolder> 
    <ReportFolder> 
    </ReportFolder> 
    <ReportFolder> 
    </ReportFolder> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
    <Report> 
    </Report> 
</Server> 

は、CTEのXML AUTO、XML EXPLICITとなりましたこれまでのXMLと私の解離を感じるように取得していますが正当化される:私はWHEREアイテムID = 1234行を取り出したら、私のような何かを得ます!

XML形式で完全な階層(最大4レベル)を取得する方法はありますか?

これは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" /> 

悪いニュース、私はあなたがあなたのレポートサーバーに「ReportTree」機能を追加することなく、それを行うことができるかどうかわからないということです。つまり、そのサーバーへのアクセスに依存します。あなたはデータベースを越えて機能する関数を得ることができるかもしれませんが、私はそれを試みませんでした。

+0

Darrel、 これは理想的です。多くのおかげです。 私はDBAになりましたので、関数を作成し、スクリプトを実行してから関数を削除して、問題はありません。 ジョナサン – Fatherjack

関連する問題