Este nuevo tipo de dato fue introducido en la versión SQL Server 2008 para facilitar el almacenamiento y la consulta de datos jerárquicos; además, de traer en una forma compacta que disminuye el numero de bytes requeridos para almacenar un nodo.
Ejemplo:
1. Creación tabla con estructura jerárquica:
CREATE TABLE [dbo].[CCCSubReasons]( [ID] [int] IDENTITY(1,1)NOTNULL, [ParentID] [hierarchyid] NOTNULL, [Level] int, [Name] [varchar] (50)NOTNULL,)
2. Adición campo Level:
Esto lo hacemos para almacenar y saber automátiamente la profundidad de un registro.
Alter Table dbo.CCCFreeSubReasons add [Level] As ParentID.GetLevel()
3. Inserción del nodo raíz:
insert into CCCFreeSubReasons3(parentid, name) VALUES (hierarchyid::GetRoot(),'Submotivos')
4. Una vez se ha establecido el nodo raíz, se podrán insertar los nodos hijos a través del siguiente procedimiento almacenado:
CREATE PROCEDURE FreeSubReasons @ParentID int, @Name varchar (50) AS BEGIN DECLARE @Manager hierarchyID, @Parent hierarchyID SELECT @Manager = ParentID FROM CCCFreeSubReasons WHERE ID = @ParentID SELECT @Parent =max(ParentID) FROM CCCFreeSubReasons WHERE ParentID.GetAncestor(1)= @Manager INSERT INTO CCCFreeSubReasons (Name, ParentID) VALUES (@Name, @Manager.GetDescendant(@Parent,null)) END GO exec FreeSubReasons 1,'Mantenimiento backbone' exec FreeSubReasons 1,'Falla backbone' exec FreeSubReasons 2,'Carrier' exec FreeSubReasons 4,'Evento programado'
5. Por último, se puede realizar la consulta:
select ID, ParentID, Name, ParentID.ToString()'SubReason Path' from CCCFreeSubReasons order by 5
ID | ParentID | Name | Level | SubReason Path |
1 | 0x | Submotivos sin producto | 0 | / |
2 | 0x58 | Mantenimiento backbone | 1 | /1/ |
4 | 0x5AC0 | Carrier | 2 | /1/1/ |
5 | 0x5AD6 | Evento programado | 3 | /1/1/1/ |
3 | 0x68 | Falla backbone | 1 | /2/ |
Hola Gracias por el aporte, consulta, se pueden mantener varias jerarquias de forma separada? o en la tabla solo se almacena una sola gran jerarquia?