SQLServer2008 の IsDescendantOf の動作がおかしくない?

概要とか

階層データを取り扱わないといけなくなったので、 hierarchyid 型を使ってみようとして MSDN のチュートリアルをやってたんですが、 IsDescendantOf で MSDN と結果が違ってしまっているので、メモ。

やってたチュートリアル → レッスン 2 – 階層テーブルでのデータの作成と管理

内容

テーブル構造

CREATE TABLE [dbo].[EmployeeOrg](
	[OrgNode] [hierarchyid] NOT NULL,
	[OrgLevel]  AS ([OrgNode].[GetLevel]()),
	[EmployeeID] [int] NOT NULL,
	[EmpName] [varchar](20) NOT NULL,
	[Title] [varchar](20) NULL,
PRIMARY KEY CLUSTERED
(
	[OrgNode] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED
(
	[EmployeeID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

投げたクエリ


DECLARE @CurrentEmployee hierarchyid

SELECT @CurrentEmployee=OrgNode FROM EmployeeOrg
	WHERE EmployeeID=46;

SELECT
 OrgNode.ToString(),
 *,
 @CurrentEmployee.IsDescendantOf(OrgNode) AS ISDESCENDANTOF
 FROM EmployeeOrg 

帰ってきた結果

image

this が @CurrentEmployee なら EmployeeID=46、つまり /1/ が this なわけで、上記結果で IsDescendantOf=1 なのは / と /1/ で、それらはthis の祖先(と自分)になってるようなんだけど…。

チュートリアルには

結果には、Sariya と Wanida の両方が表示されます。Sariya は、0 レべルの子孫であるために表示されています。Wanida は 1 レベルの子孫です。

階層的な手法を使用した階層テーブルのクエリ

って書いてあるし、 IsDecendantOf のリファレンスにも

子が this の子孫である場合に true を返します。

IsDescendantOf (データベース エンジン)

って書いてあるけど、それなら /1/ と /1/1/ の ISDESCENDANTOF が 1 になってないとおかしいよ…。

結論

バグ?それともドキュメントの間違い?クライアントがSQLServer2008R2 NovCTPだからまずいの?

それともどこか私が間違っているんでしょうか…?


Server は SQLServer2008、クライアントは SQLServer2008R2 NovCTP のSQLServerManagementStudioで確認しました。

SQLServer2008のSSMSでも確認しました。

コメントを残す