استعلام للحصول على إخراج XML للبيانات الهرمية باستخدام مسار XML في SQL Server
-
27-09-2019 - |
سؤال
لديّ جدول مع الأعمدة 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 العودية (تعبير الجدول المشترك) ، لكن هذا لم ينجح :-(
لا تنتمي إلى StackOverflow