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:
[sourcecode language=»sql»]
CREATE TABLE [dbo].[CCCSubReasons](
[ID] [int] IDENTITY(1,1)NOTNULL,
[ParentID] [hierarchyid] NOTNULL,
[Level] int,
[Name] [varchar] (50)NOTNULL,)
[/sourcecode]
2. Adición campo Level:
Esto lo hacemos para almacenar y saber automátiamente la profundidad de un registro.
[sourcecode language=»sql»]
Alter Table dbo.CCCFreeSubReasons
add [Level] As ParentID.GetLevel()
[/sourcecode]
3. Inserción del nodo raíz:
[sourcecode language=»sql»]
insert into CCCFreeSubReasons3(parentid, name)
VALUES (hierarchyid::GetRoot(),’Submotivos’)
[/sourcecode]
4. Una vez se ha establecido el nodo raíz, se podrán insertar los nodos hijos a través del siguiente procedimiento almacenado:
[sourcecode language=»sql»]
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’
[/sourcecode]
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?