SQL Server 2008 の HierarchyID データ型

SQL Server 2008 からは、HierarchyID データ型がサポートされました。HierarchyID データ型は、階層(Hierarchy)のパスを取得/操作が可能なデータ型です。
次のような親子階層をもった社員テーブル(「上司社員番号」列に上司の社員番号が格納されている)で説明します。

SQL Server 2005 では、このような階層データに対して、CTE(Common Table Expression: 共通テーブル式を利用して、再帰クエリを実行することで、階層レベルを取得することができました。これは次のように記述します。

-- SQL Server 2005 の再帰クエリの場合
WITH cte (社員番号, 社員名, 上司社員番号, 階層)
AS
(
 -- 上司
 SELECT 社員番号, 社員名, 上司社員番号, 0
  FROM 社員
   WHERE 社員番号 = 1001

	UNION ALL

 -- 部下(再帰)
 SELECT e.社員番号, e.社員名, e.上司社員番号, M.階層 + 1
  FROM 社員 AS e
   INNER JOIN cte AS M
     ON e.上司社員番号 = M.社員番号
)
SELECT * FROM cte

SQL Server 2008 からは、このクエリに対して HierarchyID データ型を利用することで、階層のパスを取得できるようになります。これは次のように記述します。

WITH cte (path, 社員番号, 社員名, 上司社員番号, 階層)
AS
(
 -- 上司
 SELECT HierarchyID::GetRoot() AS root
	   ,社員番号, 社員名, 上司社員番号, 0
  FROM 社員
   WHERE 社員番号= 1001

	 UNION ALL

 -- 部下(再帰)
 SELECT CAST(M.path.ToString() 
			  + CAST(e.社員番号AS varchar(30))
			  + '/' AS HierarchyID )
	  , e.社員番号, e.社員名, e.上司社員番号, M.階層+ 1
  FROM 社員AS e
   INNER JOIN cte AS M
     ON e.上司社員番号= M.社員番号
)
SELECT path.GetLevel(), path.ToString(), * FROM cte


HierarchyID データ型の利用方法は、オンライン ブックのこちらに記載されています。
http://msdn.microsoft.com/ja-jp/library/bb677173.aspx


そのほかの SQL Server 2008 の新機能の具体的な利用方法については、弊社執筆の SQL Server 2008 自習書シリーズ(下記 URL)の「SQL Server 2008 の注目の新機能をイチ早く試してみよう! 」編を参考にしてみてください。
http://www.microsoft.com/japan/sqlserver/2008/self-learning/default.mspx