按树排序2。[订单] 对于xml路径,键入 从MyDatabaseTable作为M 其中M.ID=Tree.ID M命令[命令] 对于xml路径'item' 从@Tree as Tree 其中树。[Level]=@Level 设置@Level=@Level-1 终止 选择XMLCol 来自@Tree 其中ID=@Root
结果按树排序2。[订单] 对于xml路径,键入 从MyDatabaseTable作为M 其中M.ID=Tree.ID M命令[命令] 对于xml路径'item' 从@Tree as Tree 其中树。[Level]=@Level 设置@Level=@Level-1 终止 选择XMLCol 来自@Tree 其中ID=@Root,xml,database,sql-server-2005,hierarchy,Xml,Database,Sql Server 2005,Hierarchy,结果 我意识到这个答案有点晚了,但它可能会帮助其他不幸的人寻找这个问题的答案。我在使用hierarchyid和XML时也遇到过类似的性能问题: 事实证明,对我来说,最简单的解决方案实际上只是在选择作为XML列之前,对hierarchyid值调用ToString。在某些情况下,这会将我的查询速度提高十倍 下面是一个展示问题的片段 创建表X id hierarchyid主键,n int -生成1000个随机项目 声明@n int=1000 当@n>0开始时 声明@parentID hierarchy
我意识到这个答案有点晚了,但它可能会帮助其他不幸的人寻找这个问题的答案。我在使用hierarchyid和XML时也遇到过类似的性能问题: 事实证明,对我来说,最简单的解决方案实际上只是在选择作为XML列之前,对hierarchyid值调用ToString。在某些情况下,这会将我的查询速度提高十倍 下面是一个展示问题的片段 创建表X id hierarchyid主键,n int -生成1000个随机项目 声明@n int=1000 当@n>0开始时 声明@parentID hierarchyID=null、@leftID hierarchyID=null、@righid hierarchyID=null 从X order by newid中选择@parentID=id 如果@parentID不为null,请从X中选择@leftID=id,其中id.GetAncestor1=@parentID按newid排序 如果@leftID不为null,请从X中选择@rightID=minid,其中id.GetAncestor1=@parentID和id>@leftID 如果@parentID为空,则设置@parentID='/' 声明@id hierarchyid=@parentID。GetDescendant@leftID,@rightID 插入X id,n个值@id,@n 设置@n-=1 终止 -使用ToString手动选择为XML 选择id.ToString id,从X中选择n作为xml路径“item”,根“items” -选择为XML而不使用ToString—使用SQL Server 2012大约慢10倍 从X中选择id,n作为xml路径“项”,根“项” 下表X
我意识到这个答案有点晚了,但它可能会帮助其他不幸的人寻找这个问题的答案。我在使用hierarchyid和XML时也遇到过类似的性能问题: 事实证明,对我来说,最简单的解决方案实际上只是在选择作为XML列之前,对hierarchyid值调用ToString。在某些情况下,这会将我的查询速度提高十倍 下面是一个展示问题的片段 创建表X id hierarchyid主键,n int -生成1000个随机项目 声明@n int=1000 当@n>0开始时 声明@parentID hierarchyID=null、@leftID hierarchyID=null、@righid hierarchyID=null 从X order by newid中选择@parentID=id 如果@parentID不为null,请从X中选择@leftID=id,其中id.GetAncestor1=@parentID按newid排序 如果@leftID不为null,请从X中选择@rightID=minid,其中id.GetAncestor1=@parentID和id>@leftID 如果@parentID为空,则设置@parentID='/' 声明@id hierarchyid=@parentID。GetDescendant@leftID,@rightID 插入X id,n个值@id,@n 设置@n-=1 终止 -使用ToString手动选择为XML 选择id.ToString id,从X中选择n作为xml路径“item”,根“items” -选择为XML而不使用ToString—使用SQL Server 2012大约慢10倍 从X中选择id,n作为xml路径“项”,根“项” 下表X
还有什么要点的吗?我不能像你那样订购它,这是不正确的:@chrno love:在你的外部SELECT语句中指定一个order BY,这样它对你来说是正确的……我想像Xmla一样订购它。还有什么要订购的吗?我不能像您那样对它进行排序,这是不正确的:@chrno love:在您的外部SELECT语句中指定一个order BY,这样它对您来说是正确的……我想将它排序为一个XML,您在使用时不需要循环CTE@GeorgePolevoy-如果您不知道如何使用CTE构建分层XML。如果你能提供一个答案,表明我多么乐意给你一个+1,从中学习并删除我的答案。在你这么做之前,我会假设你不理解问题的实质。@HieuNguyenTrung,我通过创建一个临时表,只包含层次结构中需要的记录,然后在两个字段id和parentId上创建一个索引,从而极大地提高了脚本的性能。最初,我的脚本运行了几分钟,然后使用临时表和索引,运行时间降到了4秒CTE@GeorgePolevoy-如果您不知道如何使用CTE构建分层XML。如果你能提供一个答案,表明我多么乐意给你一个+1,从中学习并删除我的答案。在你这么做之前,我会假设你不理解问题的实质。@HieuNguyenTrung,我通过创建一个临时表,只包含层次结构中需要的记录,然后在两个字段id和parentId上创建一个索引,从而极大地提高了脚本的性能。最初,我的脚本运行了几分钟,然后使用临时表和索引,运行时间降到了4秒。
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
;WITH Hierarchy AS
(
SELECT
ID, [Name], Parent, [Order], 1 AS 'Level'
FROM
dbo.YourDatabaseTable
WHERE
Parent IS NULL
UNION ALL
SELECT
t.ID, t.[Name], t.Parent, t.[Order], Level + 1 AS 'Level'
FROM
dbo.YourDatabaseTable t
INNER JOIN
Hierarchy h ON t.Parent = h.ID
)
SELECT *
FROM Hierarchy
ORDER BY [Level], [Order]