按树排序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]