Pregunta Algunas preguntas sobre HierarchyId (SQL Server 2008)


Soy un novato en SQL Server 2008 y acabo de presentarme a HierarchyId.

Estoy aprendiendo de SQL Server 2008 - HIERARCHYID - PARTE I. Así que básicamente estoy siguiendo el artículo línea por línea y mientras practico en SSMS encontré que para cada ChildId se generan algunos valores hexadecimales como 0x, 0x58, 0x5AC0, etc.

Mis preguntas son

  1. ¿Cuáles son estos valores hexadecimales?
  2. ¿Por qué se generan y cuál es su uso? Quiero decir, ¿dónde puedo usar esos valores hexa?
  3. ¿Tenemos algún control sobre esos valores hexa? Quiero decir, ¿podemos actualizar, etc.
  4. Cómo determinar la jerarquía observando esos valores hexa ... Quiero decir, ¿cómo puedo determinar cuál es el padre y cuál es el hijo?

11
2017-12-16 12:27


origen


Respuestas:


Esos valores hexadecimales son simplemente una representación binaria del nivel de jerarquía. En general, no debe usarlos directamente.

Es posible que desee comprobar el siguiente ejemplo, que creo que debería ser autoexplicativo. Espero que te ayude en la dirección correcta.

Crea una tabla con un hierarchyid campo:

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

Inserta algunos valores:

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/'));

Consulta la tabla:

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

11
2017-12-17 21:49



Adam Milazzo escribió un gran artículo sobre las entrañas de hierarchyid aquí:

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

En pocas palabras, no es significativo trabajar con cosas en hex recto, sino convertir los números a binarios. La razón es que las cosas no están cortadas ni siquiera en los límites de los bytes. La representación de un solo nodo puede ser tan corta como 5 bits si es uno de los primeros cuatro nodos. Se vuelve más y más largo a medida que se usan más nodos, 6 bits cada uno para los siguientes 4 nodos, 7 bits cada uno para los 8 nodos siguientes, y luego salta a 12 bits cada uno para los siguientes 64 nodos. Y luego hasta 18 bits cada uno para el próximo 1024.

Necesitaba convertir una base de datos a Postgres, y escribí una secuencia de comandos que analiza estos valores hexadecimales. Puede consultar una versión que hice para AdventureWorks aquí, buscar "hierarchyid":

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


0
2018-04-29 08:46



Dejaré que otros aborden sus preguntas específicas, pero les diré que, IMO, el HierarchyId en SQL Server 2008 no es una de las mayores contribuciones de Microsoft a SQL Server. Son complejos y un tanto incómodos. Creo que encontrará que para muchas necesidades jerárquicas, las expresiones comunes de tablas (CTE) funcionan muy bien.

Cachondo


-3
2017-12-16 12:36



Preguntas populares