استعلام للحصول على إخراج XML للبيانات الهرمية باستخدام مسار XML في SQL Server

StackOverflow https://stackoverflow.com/questions/4256900

سؤال

لديّ جدول مع الأعمدة nodeid ، nodenodeid ، وأريد أن أؤدي إلى ouput بيانات الجدول بأكمله في شكل XML مثل ما يلي باستخدام استعلام SQL. أعتقد أن وضع مسار XML في SQL Server يمكن استخدامه لتحقيق ذلك (أستخدم SQL Server 2008) باستخدام العودية ، ولكن لست متأكدًا من كيفية. شكرا مقدما

<?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>
هل كانت مفيدة؟

المحلول

لقد قمت بحلها باستخدام إجراء مخزن ووظيفة متكررة. الكود الموضح أدناه. (في الواقع أردت أن يقوم هذا بإنشاء قائمة 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

نصائح أخرى

هذا الاستعلام سيفعل ذلك - ومع ذلك ، فإنه ليس نظيفًا للغاية حيث يجب عليك "تحديد" التعشيش يدويًا ولن يتوسع تلقائيًا إلى مستويات أكثر عميقًا ....

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 العودية (تعبير الجدول المشترك) ، لكن هذا لم ينجح :-(

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top