2011-03-11 86 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