2009-12-16 43 views
11

我是SQL Server 2008中的新手,剛剛介紹給HierarchyId。我正在學習SQL Server 2008 - HIERARCHYID - PART I。所以基本上我下面一行文章線,而在SSMS練我發現每childID的一些十六進制值像0X,0x58,0x5AC0等產生有關HierarchyId的一些問題(SQL Server 2008)

我的問題是

  1. 這些是什麼十六進制值?
  2. 這些爲什麼會生成,它們的用途是什麼?我的意思是我可以在哪裏使用這些hexa值?
  3. 我們是否對這些hexa值有任何控制權?我的意思是我們可以更新等。
  4. 如何通過查看這些hexa值來確定層次結構..我的意思是如何確定哪個是父母,哪個是孩子?

回答

-3

我會讓別人解決你的具體問題,但我會告訴你,IMO,SQL Server 2008中的HierarchyId並不是微軟對SQL Server最大的貢獻之一。他們很複雜,有些尷尬。我認爲你會發現,對於許多層次需求,公用表表達式(CTE)工作得很好。

蘭迪

+6

我想你指的是遞歸的熱膨脹係數,熱膨脹係數爲一般都無關層次。即便如此,這兩個概念並不相互排斥,而且hierarchyid與我見過的任何其他方法(索引和正確使用時)相比,具有更好的性能。 hierarchyid列也可以與其他嵌套集類型列結合使用,以執行具有索引搜索性能的非常複雜的分層查詢。我會說你的批評是沒有根據的; hierarchyid實際上是SQL 2008中最常用的數據類型之一。 – Aaronaught 2009-12-18 23:50:42

+2

它不僅沒有被充分利用,而且還沒有得到支持。 LinqtoSQL或實體框架中不支持HierarchyId(dbml Designer不會觸及它們)。即使在VS 2010 RC中也是如此。 – 2010-02-11 00:19:27

+2

對於我們中的一些人來說,HierarchyId是SQL中非常需要的補充。它消除了對許多遞歸查詢的需求,並且在正確使用時可以顯着提高性能。 – Mark 2010-03-26 08:23:46

11

這些十六進制值只是在層級的一個二進制表示。一般來說,你不應該直接使用它們。

你可能想看看下面的例子,我認爲這應該是不言自明的。我希望它能讓你朝着正確的方向前進。

hierarchyid字段創建一個表:

CREATE TABLE groups (
    group_name  nvarchar(100) NOT NULL, 
    group_hierarchy hierarchyid NOT NULL 
); 

插入一些值:

INSERT INTO groups (group_name, group_hierarchy) 
VALUES 
    ('root',  hierarchyid::Parse('/')), 
    ('domain-a', hierarchyid::Parse('/1/')), 
    ('domain-b', hierarchyid::Parse('/2/')), 
    ('sub-a-1', hierarchyid::Parse('/1/1/')), 
    ('sub-a-2', hierarchyid::Parse('/1/2/')); 

查詢表:

SELECT 
    group_name, 
    group_hierarchy.ToString() 
FROM 
    groups 
WHERE 
    (group_hierarchy.IsDescendantOf(hierarchyid::Parse('/1/')) = 1); 
0

亞當米拉佐寫到這裏HIERARCHYID內臟一個偉大的文章:

http://www.adammil.net/blog/view.php?id=100

簡而言之,這是沒有意義的,在直十六進制的東西的工作,而是轉換的數字出來爲二進制。原因在於甚至字節邊界上的東西都沒有被切斷。如果它是前四個節點之一,則表示單個節點可以短至5位。隨着更多節點的使用,時間越來越長,接下來的4個節點每個節點有6個比特,接下來的8個節點每個節點有7個比特,然後每個節點跳轉到12個比特,以便接下來的64個節點!然後在下一個1024中每個最多18位。

我需要將數據庫轉換爲Postgres,並編寫了解析這些十六進制值的腳本。您可以檢查出一個版本,我對這裏的AdventureWorks做,搜索「HIERARCHYID」:

https://github.com/lorint/AdventureWorks-for-Postgres/blob/master/install.sql