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;

Comentarios recientes