2010-11-23 13 views
10

Tengo una tabla con las columnas NodeId, NodeName, ParentNodeId y quiero mostrar datos completos de la tabla en forma de Xml como el siguiente mediante la consulta SQL. Creo que para el modo XML PATH en el servidor Sql se puede usar para lograr esto (uso SQL Server 2008) usando la recursión, pero no estoy seguro de cómo. Gracias de antemanoConsulta para obtener resultados XML para datos jerárquicos utilizando FOR XML PATH en SQL Server

<?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

¿Pudo añadir cabecera? –

Respuesta

7

Lo resolví usando un procedimiento almacenado y una función recursiva. código que se muestra a continuación. (En realidad quería esto para generar un xml menú, así se muestra el código para el menú.

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

Esta consulta hacerlo - sin embargo, no es muy limpio en el que usted tiene que "manualmente" definir la anidación y que no sólo va a escalar automáticamente a más niveles de profundidad ....

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') 

de salida es:

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

tenía la esperanza de que habría una manera de hacer esto con un CTE recursiva (expresión de tabla común), pero que no funcionó :-(

+0

gracias por su respuesta. – RKP

Cuestiones relacionadas