带有XML的SQL Server 2005中的层次结构

我想知道无论如何在SQL Server 2005中选择层次结构并返回xml格式?
我有一个包含大量数据的数据库(大约2000到3000条记录),我现在在SQL Server 2005中使用一个函数来检索层次结构中的数据并返回一个 XML但它看起来并不完美,因为它太慢了很多数据

这是我的功能

数据库

ID      Name      Parent       Order

功能

CREATE FUNCTION [dbo].[GetXMLTree]
(
    @PARENT bigint
)
RETURNS XML
AS
    BEGIN
    RETURN /* value */
(SELECT [ID] AS "@ID",[Name] AS "@Name",[Parent] AS "@Parent",[Order] AS "@Order",dbo.GetXMLTree(Parent).query('/xml/item')
    FROM MyDatabaseTable
    WHERE [Parent]=@PARENT
    ORDER BY [Order]
    FOR XML PATH('item'),ROOT('xml'),TYPE)
    END

我想在层次结构中使用XML,因为对我而言,有很多事情要做:)
任何最好的解决方案plzzzzz

解决方法

您可以使用递归CTE来构建层次结构并在层上循环以构建XML.

-- Sample data
create table MyDatabaseTable(ID int,Name varchar(10),Parent int,[Order] int)
insert into MyDatabaseTable values
(1,'N1',null,1),(2,'N1_1',1,(3,'N1_1_1',2,(4,'N1_1_2',2),(5,'N1_2',(6,'N2',(7,'N2_1',6,1)

-- set @Root to whatever node should be root
declare @Root int = 1

-- Worktable that holds temp xml data and level
declare @Tree table(ID int,[Order] int,[Level] int,XMLCol xml)

-- Recursive cte that builds @tree
;with Tree as 
(
  select 
    M.ID,M.Parent,M.[Order],1 as [Level]
  from MyDatabaseTable as M
  where M.ID = @Root
  union all
  select 
    M.ID,Tree.[Level]+1 as [Level]
  from MyDatabaseTable as M
    inner join Tree
      on Tree.ID = M.Parent  
)
insert into @Tree(ID,Parent,[Order],[Level])
select *
from Tree


declare @Level int
select @Level = max([Level]) from @Tree

-- Loop for each level
while @Level > 0
begin

  update Tree set
    XMLCol = (select
                M.ID as '@ID',M.Name as '@Name',M.Parent as '@Parent',M.[Order] as '@Order',(select XMLCol as '*'
                 from @Tree as Tree2
                 where Tree2.Parent = M.ID
                 order by Tree2.[Order]
                 for xml path(''),type)
              from MyDatabaseTable as M
              where M.ID = Tree.ID
              order by M.[Order]
              for xml path('item'))
  from @Tree as Tree             
  where Tree.[Level] = @Level

  set @Level = @Level - 1
end

select XMLCol
from @Tree
where ID = @Root

结果

<item ID="1" Name="N1" Order="1">
  <item ID="2" Name="N1_1" Parent="1" Order="1">
    <item ID="3" Name="N1_1_1" Parent="2" Order="1" />
    <item ID="4" Name="N1_1_2" Parent="2" Order="2" />
  </item>
  <item ID="5" Name="N1_2" Parent="1" Order="2" />
</item>

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念