我想知道无论如何在SQL Server 2005中选择层次结构并返回xml格式? 我有一个包含大量数据的数据库(大约2000到3000条记录),我现在在SQL Server 2005中使用一个函数来检索层次结构中的数据并返
我有一个包含大量数据的数据库(大约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
-- 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 , 1),
(3, 'N1_1_1', 2 , 1),
(4, 'N1_1_2', 2 , 2),
(5, 'N1_2', 1 , 2),
(6, 'N2', null, 1),
(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, Parent 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,
M.Parent,
M.[Order],
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>
