概要とか
階層データを取り扱わないといけなくなったので、 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
帰ってきた結果
this が @CurrentEmployee なら EmployeeID=46、つまり /1/ が this なわけで、上記結果で IsDescendantOf=1 なのは / と /1/ で、それらはthis の祖先(と自分)になってるようなんだけど…。
チュートリアルには
結果には、Sariya と Wanida の両方が表示されます。Sariya は、0 レべルの子孫であるために表示されています。Wanida は 1 レベルの子孫です。
って書いてあるし、 IsDecendantOf のリファレンスにも
子が this の子孫である場合に true を返します。
って書いてあるけど、それなら /1/ と /1/1/ の ISDESCENDANTOF が 1 になってないとおかしいよ…。
結論
バグ?それともドキュメントの間違い?クライアントがSQLServer2008R2 NovCTPだからまずいの?
それともどこか私が間違っているんでしょうか…?
Server は SQLServer2008、クライアントは SQLServer2008R2 NovCTP のSQLServerManagementStudioで確認しました。
SQLServer2008のSSMSでも確認しました。