Jerarquico

Este tipo de datos utilizado para organizar datos jerárquicamente.

 

Algunos ejemplos para enteder de que se trata:

 

--- Seleccionamos la db
use abeldb
go

-- Hacemos una copia de la tabla empleados
if object_id(N'EmpleadoOrganicacion' ) is not null
	drop table EmpleadoOrganicacion

create table EmpleadoOrganicacion
(
	 -- OrgNode: campo jearquico
	 OrgNode		hierarchyid			Primary Key Clustered
	 -- OrgLevel: nivel que ocupa el registro dentro de la jerarquia
	,OrgNivel		as OrgNode.GetLevel()
	,EmpleadoID		int			Unique not null
	,EmpleadoNombre varchar(50)			not null
	,Titulo			varchar(50)		null
)

-- Creamos una idx compuesto para mejorar las busquedas
create unique index EmpleadoOrgNode
	on EmpleadoOrganicacion ( orgNivel, orgNode );

-- Insertamos registros

-- Primero un nodo raiz
INSERT EmpleadoOrganicacion (OrgNode, EmpleadoID, EmpleadoNombre, Titulo)
VALUES (hierarchyid::GetRoot(), 6, 'Jefe Root', 'Tit. Emp. Root') ;
GO

-- Ahora insertamos alguien que depende del root (en este caso Jefe Root)
declare @mOrgNode hierarchyid, @lc hierarchyid, @idSuperior int
declare @e_id int, @e_nombre varchar(20), @titulo varchar(20)

set @idSuperior			= 6
set @e_id				= 10
set @e_nombre			= 'Sub 1'
set @titulo				= 'Titulo Sub 1'

   SELECT	@mOrgNode = OrgNode 
   FROM	EmpleadoOrganicacion
   WHERE	EmpleadoID = @idSuperior
   
   SELECT	@lc = max(OrgNode) 
   FROM	EmpleadoOrganicacion
   WHERE	OrgNode.GetAncestor(1) =@mOrgNode ;


INSERT EmpleadoOrganicacion (OrgNode, EmpleadoID, EmpleadoNombre, Titulo)
VALUES(@mOrgNode.GetDescendant(@lc, NULL), @e_id, @e_nombre, @titulo)


-- Ahora insertamos alguien que depende del root (en este caso sub 1)

set @idSuperior			= 10
set @e_id				= 15
set @e_nombre			= 'Sub 1-1'
set @titulo				= 'Titulo Sub 1-1'

   SELECT	@mOrgNode = OrgNode 
   FROM	EmpleadoOrganicacion
   WHERE	EmpleadoID = @idSuperior
   
   SELECT	@lc = max(OrgNode) 
   FROM	EmpleadoOrganicacion
   WHERE	OrgNode.GetAncestor(1) =@mOrgNode ;


INSERT EmpleadoOrganicacion (OrgNode, EmpleadoID, EmpleadoNombre, Titulo)
VALUES(@mOrgNode.GetDescendant(@lc, NULL), @e_id, @e_nombre, @titulo)


-- Ahora insertamos una segunda persona que depende del root (en este caso Jefe Root)

set @idSuperior			= 6
set @e_id				= 50
set @e_nombre			= 'Sub 2'
set @titulo				= 'Titulo Sub 2'

   SELECT	@mOrgNode = OrgNode 
   FROM	EmpleadoOrganicacion
   WHERE	EmpleadoID = @idSuperior
   
   SELECT	@lc = max(OrgNode) 
   FROM	EmpleadoOrganicacion
   WHERE	OrgNode.GetAncestor(1) =@mOrgNode ;


INSERT EmpleadoOrganicacion (OrgNode, EmpleadoID, EmpleadoNombre, Titulo)
VALUES(@mOrgNode.GetDescendant(@lc, NULL), @e_id, @e_nombre, @titulo)


-- Consultamos los datos insertados
SELECT		 OrgNode.ToString()		as orgNodeTexto
			,OrgNode
			,OrgNivel
			,EmpleadoID
			,EmpleadoNombre
			,Titulo
FROM		 EmpleadoOrganicacion;