2011-03-11 82 views
2

我寻找一种方式来填充现有父子表:在现有父子关系表中填充hierarchyid列?

Tabelle: Categories 
------------------- 
Columns: CategoryID 
     ParentID 

我我的SQL Server升级到2008 R2。现在我添加了新的hierarchyid-datatype来优化性能。

所以我想编写一个sql-trigger来重新组织hierarchyid-column,当​​insert/update会调用...但我不是sql专家,所以我希望有人能帮助我。

测试查询:(我需要字符串附加在每个递归调用)

;WITH CTE (CategoryID, ParentID, HierarchyString) AS (
    SELECT CategoryID, ParentID, HierarchyString = CAST(ParentID AS VARCHAR(8000)) + '/' + CAST(CategoryID AS VARCHAR(8000)) 
    FROM Categories 
    UNION ALL 
    SELECT r.CategoryID, r.ParentID, HierarchyString = CAST(p.CategoryID AS VARCHAR(8000)) + '/' + CAST(r.ParentID AS VARCHAR(8000)) 
    FROM Categories r 
    INNER JOIN CTE p ON r.CategoryID = p.ParentID 
) 

SELECT * FROM CTE; 

回答

2

我已经测试了许多疑问和现在下面的查询工作,但它绝对不是干净/优化.. 。也许有人可以改进查询。

;WITH CTE (CategoryID, ParentID, Hierarchy) AS (
    SELECT CategoryID, ParentID, Hierarchy 
    FROM Categories 
    UNION ALL 
    SELECT p.CategoryID, r.ParentID, hierarchyid::Parse(REPLACE((r.Hierarchy.ToString() + p.Hierarchy.ToString()), '//', '/')) 
    FROM Categories r 
    INNER JOIN CTE p ON r.CategoryID = p.ParentID 
) 

SELECT CTE.CategoryID, R.ParentID, CTE.Hierarchy.ToString() 
FROM CTE 
INNER JOIN Categories AS R ON CTE.CategoryID = R.CategoryID 
WHERE CTE.Hierarchy.ToString() LIKE '%/' + CAST(CTE.ParentID AS VARCHAR) + '/' + CAST(CTE.CategoryID AS VARCHAR) + '/%' OR CTE.ParentID = 0