-- 测试环境
CREATE TABLE [dbo].[Folder]
(
[FolderNode] HIERARCHYID NOT NULL,
[Description] NVARCHAR(50) NOT NULL
);
GO
--Add node A
DECLARE @folderNode HIERARCHYID = HIERARCHYID::GetRoot();
INSERT INTO [dbo].[Folder]
VALUES (@folderNode, 'A')--Add node B (first child, so NULL, NULL)
DECLARE @childFolderNode HIERARCHYID = @folderNode.GetDescendant(NULL, NULL);
INSERT INTO [dbo].[Folder]
VALUES (@childFolderNode, 'B')--Add node E (second child, so Child 1, NULL)
SET @childFolderNode = @folderNode.GetDescendant(@childFolderNode, NULL);
INSERT INTO [dbo].[Folder]
VALUES (@childFolderNode, 'E')--Add node F (third child, so Child 2, NULL)
SET @childFolderNode = @folderNode.GetDescendant(@childFolderNode, NULL);
INSERT INTO [dbo].[Folder]
VALUES (@childFolderNode, 'F')
SELECT @folderNode = FolderNode
FROM [dbo].[Folder]
WHERE Description = 'B'
SET @childFolderNode = @folderNode.GetDescendant(NULL, NULL);
INSERT INTO [dbo].[Folder]
VALUES (@childFolderNode, 'C')--Add node D (second child, so Child 1, NULL)
SET @childFolderNode = @folderNode.GetDescendant(@childFolderNode, NULL);
INSERT INTO [dbo].[Folder]
VALUES (@childFolderNode, 'D')
SET @childFolderNode = @childFolderNode.GetDescendant(NULL, NULL);
INSERT INTO [dbo].[Folder]
VALUES (@childFolderNode, 'G')INSERT dbo.Folder (
FolderNode,
Description

SELECT FolderNode.GetDescendant(NULL,NULL).ToString(),'H'
FROM Folder 
WHERE Description = 'E'
-- 查询测试表
SELECT *,FolderNode.ToString() FROM dbo.Folder--FolderNode Description 
0x A /
0x58 B /1/
0x68 E /2/
0x78 F /3/
0x5AC0 C /1/1/
0x5B40 D /1/2/
0x5B56 G /1/2/1/
0x6AC0 H /2/1/--问题
将B的父亲改为E,当然B的后代也要相应更新。2005时代的老方法就别粘贴啦,谢谢。另外给大家介绍一本书,Intorducing Microsoft SQL Server 2008,这本书只讲SQL Server 2008的新特性,不罗嗦,值得一读,网上很容易搜到。大家要读过就别说我out啦,我刚开始看。

解决方案 »

  1.   

    HierachyID哪儿都好,就是这点效率太低了,牵一发而动全身
      

  2.   

    不好意思少打个r HierarchyID
      

  3.   

    有了HierarchyID,就不用再用递归、循环方式解决树的问题了
      

  4.   

    答题。汗!以为发分呢。好像没有什么好办法。
    DECLARE @folderNode HIERARCHYID = '/2/1/'
    update dbo.Folder
    set [email protected]('/2/1/','/2/1/1/') where description ='H'
    GO
    DECLARE @folderNode HIERARCHYID = '/1/'
    , @OldParent hierarchyid = '/1/'
    , @NewParent hierarchyid = '/2/1/'
    UPDATE dbo.Folder
    SET foldernode = @folderNode.GetReparentedValue(@OldParent, @NewParent) 
    WHERE description ='B'(1 行受影响)(1 行受影响)SELECT *,FolderNode.ToString() FROM dbo.Folder
    --result:
    FolderNode Description (无列名)
    0x A /
    0x6AC0 B /2/1/
    0x68 E /2/
    0x78 F /3/
    0x5AC0 C /1/1/
    0x5B40 D /1/2/
    0x5B56 G /1/2/1/
    0x6AD6 H /2/1/1/
      

  5.   

    谢谢,我已找到通用的解决办法了,HierarchyID很好,很强大!没有效率低、不方便的地方。结贴