2017-08-08 65 views
0

我有一個產品列表,使用HierarchyId進行排序,但對於某些項目,層次結構的完整路徑產生了錯誤的結果。只有幾...生病下面表明:SQL HierarchyId有時會產生錯誤的路徑

SELECT 
    ProductId 
    ,Name 
    ,FullName 
    ,Hierarchy 
    ,Hierarchy.ToString() as hierarchyString 
    ,editor.ufn_Product_GetFullName(ProductId) as ufnGetFullName 
    ,Hierarchy.GetLevel() as [level] 
FROM Editor.Product 
WHERE ProductId = 378 
    OR Hierarchy.ToString() like '/16/1/1/%' 
    OR Hierarchy.ToString() = '/16/1/' 
    OR Hierarchy.ToString() = '/16/' 
    OR Hierarchy.ToString() = '/' 
ORDER BY Hierarchy.ToString() 

使用該查詢我得到的結果是:

enter image description here 大部分從過程返回的路徑都很好,生產

'外部>渲染>顏色>白色'

然而其中四個產生最後兩個交換PED像

「外觀>渲染>白色>顏色」

我不能爲我的生活,找出原因的條款進行交換,爲什麼只有一些。層次結構看起來正確,並且子級項目上的級別都是正確的。我需要你的幫助......

以下是用於從產品層次結構生成路徑的功能,但我不明白它是如何成爲問題的。

ALTER FUNCTION [Editor].[ufn_Product_GetFullName] (@ID INT) 
RETURNS VARCHAR(8000) 
AS BEGIN 
    -- Create and insert names into temp table 
    DECLARE @NamesTable TABLE (Name varchar(8000)); 

    INSERT @NamesTable (Name) 
     SELECT t1.Name 
     FROM ( SELECT ProductId, Hierarchy, Name 
       FROM Product WITH(NOLOCK) 
       WHERE (ProductId = @ID)) AS t2 
      CROSS JOIN Product AS t1 

     WHERE (t1.Hierarchy = t2.Hierarchy) 
     OR (t1.Hierarchy <> '/') 
     AND (t2.Hierarchy.IsDescendantOf(t1.Hierarchy) = 1) 

     ORDER BY t1.Hierarchy; 

    -- Define name string 
    DECLARE @Name VARCHAR(8000); 

    -- Coalesce names from temp table into one long string 
    SELECT @Name = COALESCE(@Name + ' > ', '') + Name 
    FROM @NamesTable 

    -- Return full string 
    RETURN @Name 
END 
+0

這真的是MySQL代碼嗎? – jarlh

回答

1

沒有ORDER BY條款你不能確定的行的次序。將表Level添加到@NamesTable表。將ORDER BY子句添加到SELECT您正在拼接字符串的位置。這應該有所幫助。

ALTER FUNCTION [Editor].[ufn_Product_GetFullName] (@ID INT) 
RETURNS VARCHAR(8000) 
AS BEGIN 
    -- Create and insert names into temp table 
    DECLARE @NamesTable TABLE (Name varchar(8000), Level int); 

    INSERT @NamesTable (Name, Level) 
     SELECT t1.Name, t1.Hierarchy.getLevel() 
     FROM ( SELECT ProductId, Hierarchy, Name 
       FROM Product WITH(NOLOCK) 
       WHERE (ProductId = @ID)) AS t2 
      CROSS JOIN Product AS t1 

     WHERE (t1.Hierarchy = t2.Hierarchy) 
     OR (t1.Hierarchy <> '/') 
     AND (t2.Hierarchy.IsDescendantOf(t1.Hierarchy) = 1) 

     ORDER BY t1.Hierarchy; 

    -- Define name string 
    DECLARE @Name VARCHAR(8000); 

    -- Coalesce names from temp table into one long string 
    SELECT @Name = COALESCE(@Name + ' > ', '') + Name 
    FROM @NamesTable 
    ORDER BY Level 

    -- Return full string 
    RETURN @Name 
END 
+1

爲了使它工作,我不得不添加級別到INSERT @NamesTable(Name)行並將您的t1.level更改爲t1.Hierarchy.getLevel(),否則它完美地工作,謝謝:) – Xynos

+0

對不起!我完全忘記了這一點。我會更新我的答案。 – Rokuto