2010-11-23 7 views
10

NodeId、NodeName、ParentNodeIdという列を持つテーブルがあり、SQLクエリを使用して次のようにXmlの形式でテーブルデータ全体を出力します。私はSQL ServerのFOR XML PATHモードは再帰を使用してこれを(私はSQL Server 2008を使用して)達成するために使用することができますが、どのように確認することができると思う。事前のおかげでSQL ServerのFOR XML PATHを使用して階層データのXML出力を取得するクエリ

<?xml version="1.0" encoding="utf-8" ?> 
<Nodes> 
    <Node Id="1" Name="node1"> 
    <Node Id="11" Name="node11"> 
     <Node Id="111" Name="node111" /> 
     <Node Id="112" Name="node112" /> 
    </Node> 
    </Node> 
    <Node Id="2" Name="node2"> 
    <Node Id="21" Name="node21"> 
     <Node Id="211" Name="node211" /> 
     <Node Id="212" Name="node212" /> 
    </Node> 
    </Node> 
</Nodes> 
+0

ヘッダを追加できましたか? –

答えて

7

私はそれをストアドプロシージャと再帰関数を使用して解決しました。コードを以下に示します。 (実際にはメニューXMLを生成するので、メニューのコードが表示されます。

CREATE PROCEDURE [dbo].[usp_GetMenu] 
    AS 
    BEGIN 
     SET NOCOUNT ON; 

     SELECT dbo.fnGetMenuItems(MenuId) 
     FROM dbo.Menu 
     WHERE ParentMenuId IS NULL 
     FOR XML PATH('MenuItems') 
    END 
    GO 

CREATE FUNCTION [dbo].[fnGetMenuItems] 
(
    @MenuId int 
) 
RETURNS XML 
WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 

    RETURN 
    (
     SELECT MenuId AS "@Id" 
       , [Name] AS "@Name" 
       , [URL] AS "@URL" 
       , [Key] AS "@Key" 
       , [dbo].[fnGetMenuItems](MenuId) 
     FROM dbo.Menu 
     WHERE ParentMenuId = @MenuId 
     FOR XML PATH('MenuItem'),TYPE 
    ) 

END 
GO 
3

このクエリはそれを行うだろうが - しかし、それはあなたが「手動」ネストを定義し、それだけで自動的に深い以上のレベルに拡張しません持っているという点で、非常にきれいではありません....

SELECT 
    n.ID AS '@Id', 
    n.NAME AS '@Name', 
    (SELECT 
     n2.ID AS '@Id', 
     n2.NAME AS '@Name', 
     (SELECT 
      n3.ID AS '@Id', 
      n3.NAME AS '@Name' 
     FROM 
      dbo.Nodes n3 
     WHERE 
      n3.ParentNode = n2.ID 
     FOR XML PATH('Node'), TYPE 
     ) 
    FROM 
     dbo.Nodes n2 
    WHERE 
     n2.ParentNode = n.ID 
    FOR XML PATH('Node'), TYPE 
    ) 
FROM 
    dbo.Nodes n 
WHERE 
    n.ParentNode IS NULL 
FOR XML PATH('Node'), ROOT('Nodes') 

出力は次のとおりです。

<Nodes> 
    <Node Id="1" Name="node1"> 
    <Node Id="11" Name="node11"> 
     <Node Id="111" Name="node111" /> 
     <Node Id="112" Name="node112" /> 
    </Node> 
    </Node> 
    <Node Id="2" Name="node2"> 
    <Node Id="21" Name="node21"> 
     <Node Id="211" Name="node211" /> 
     <Node Id="212" Name="node212" /> 
    </Node> 
    </Node> 
</Nodes> 

私は再帰CTE(共通テーブル式)でこれを行う方法があるだろう期待していたが、それは:-(

012をうまくいきませんでした
+0

お返事ありがとうございます。 – RKP

関連する問題