Hierarchyid는 다음과 같은 특징과 이점을 가진다. * 계층적 작업을 위한 Data type * 조직구조 * 파일 시스템 * 프로젝트 태스트 집합 * 언어 용어의 분류 * 웹 페이지 간 링크의 그래프 * 높은 압축성 {{{ USE AdventureWorks GO --테이블생성 CREATE TABLE HumanResources.EmployeeOrg ( OrgNode hierarchyid PRIMARY KEY CLUSTERED, --여기주목! OrgLevel AS OrgNode.GetLevel(), --여기주목! EmployeeID int UNIQUE NOT NULL, EmpName varchar(20) NOT NULL, Title varchar(20) NULL ) ; GO --인덱스생성(넓이기반인덱스생성) CREATE UNIQUE INDEX EmployeeOrgNc1 ON HumanResources.EmployeeOrg(OrgLevel, OrgNode) ; GO --루트삽입 INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title) VALUES (hierarchyid::GetRoot(), 6, 'David', 'Marketing Manager') ; GO --검색1 SELECT * FROM HumanResources.EmployeeOrg }}} attachment:HierarchyidDataType/hierarchyid01.jpg {{{ --검색2 SELECT OrgNode.ToString() AS Text_OrgNode , OrgNode , OrgLevel , EmployeeID , EmpName , Title FROM HumanResources.EmployeeOrg }}} attachment:HierarchyidDataType/hierarchyid02.jpg 부하직원 삽입(GetDescendant()메서드사용) attachment:HierarchyidDataType/hierarchyid03.jpg?width=60% {{{ DECLARE @Manager hierarchyid SELECT @Manager = hierarchyid::GetRoot() FROM HumanResources.EmployeeOrg ; INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title) VALUES (@Manager.GetDescendant(NULL, NULL), 46, 'Sariya', 'Marketing Specialist') ; --검색 SELECT OrgNode.ToString() AS Text_OrgNode , OrgNode , OrgLevel , EmployeeID , EmpName , Title FROM HumanResources.EmployeeOrg }}} attachment:HierarchyidDataType/hierarchyid04.jpg {{{ --귀찮으니프로시저생성후삽입 CREATE PROC AddEmp(@mgrid int, @empid int, @e_name varchar(20), @title varchar(20)) AS BEGIN DECLARE @mOrgNode hierarchyid, @lc hierarchyid SELECT @mOrgNode = OrgNode FROM HumanResources.EmployeeOrg WHERE EmployeeID = @mgrid SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION SELECT @lc = max(OrgNode) FROM HumanResources.EmployeeOrg WHERE OrgNode.GetAncestor(1) =@mOrgNode ; INSERT HumanResources.EmployeeOrg (OrgNode, EmployeeID, EmpName, Title) VALUES(@mOrgNode.GetDescendant(@lc, NULL), @empid, @e_name, @title) COMMIT END ; GO EXEC AddEmp 6, 271, 'John', 'Marketing Specialist' ; EXEC AddEmp 6, 119, 'Jill', 'Marketing Specialist' ; EXEC AddEmp 46, 269, 'Wanida', 'Marketing Assistant' ; EXEC AddEmp 271, 272, 'Mary', 'Marketing Assistant' ; EXEC AddEmp 6, 120, 'yasi', 'Marketing Specialist' ; --검색 SELECT OrgNode.ToString() AS Text_OrgNode , OrgNode , OrgLevel , EmployeeID , EmpName , Title FROM HumanResources.EmployeeOrg }}} attachment:HierarchyidDataType/hierarchyid05.jpg {{{ SELECT OrgNode.ToString() AS Text_OrgNode , hierarchyid::GetRoot() AS Text_Root , OrgNode.GetAncestor(1) AS Text_Ancestor , (SELECT EmpName FROM HumanResources.EmployeeOrg B WHERE B.OrgNode = A.OrgNode.GetDescendant(0x78, NULL)) 자식 FROM HumanResources.EmployeeOrg A WHERE EmpName = 'David' }}} attachment:HierarchyidDataType/hierarchyid06.jpg * [http://www.mssqltips.com/tip.asp?tip=1766 Retaining historical index usage statistics for SQL Server - Part 2] * [http://www.sqlservercentral.com/articles/SQL+Server+2008/67787/ HIERARCHYID Data Type, Large User Defined Types]