HierarchyIdでツリーブランチをロード/読み取るためのセットベースの方法はありますか


11

HierarchyIdをいじっていますが、次のことを行うためのセットベースの方法を理解していません。

  • すべてのサブツリーを一度に挿入する
  • 一度にすべてのサブツリーを取得する

この質問は以前の質問に関連しおり、HierarchyIdでこれらの2つのタスクを実行する唯一の方法は、一度に1つのノードまたは1つのレベルであると思われます。実体化されたパスを使用している場合、両方のアクションは、単一の(そして些細な)セットベースのコマンドによって簡単に実行されます。

私は何が欠けていますか?

編集:サブツリーを移動する方法も見逃しましたが、ミカエル・エリクソンのコメントからそれを学びました


2
これを見たことがありますか?サブツリーの移動
ミカエルエリクソン、

@MikaelErikssonコメントを回答にできますか?
AK

2
承知しました。何が起こっているのかを理解する方法についても少し詳しく説明しました。ところで、私はHierarchyIdで少しテストしただけで、実稼働では使用していません。
ミカエルエリクソン

回答:


5

使用する関数はGetReparentedValueですGetReparentedValue、ツリーのみを使用すると、「不整合」状態になる可能性があります。

以下は、Microsoftが提供するコードの一部です。サブツリーの移動

これに関連するのは、ツリーを強制することだと思います。PKに自己結合する親IDの計算列を使用します。


これがこれまでのベストアンサーです。残念ながら、1つのコマンドで複数のレベルのサブツリーを挿入/選択する方法がわかりません。
AK

3

サブツリー全体を取得するのは簡単です-使用IsDescendentOfごとに、メソッドをMSDN

DECLARE @Manager hierarchyid
SELECT @Manager = OrgNode FROM HumanResources.EmployeeDemo
  WHERE LoginID = 'adventure-works\dylan0'

SELECT * FROM HumanResources.EmployeeDemo
WHERE OrgNode.IsDescendantOf(@Manager) = 1

挿入はより複雑ですが、主な問題は制約にあります。親がコミットされるまで、子オブジェクトを挿入することはできません。この場合、反復して階層順に挿入するか、制約をオフにして挿入します。

大量のデータを挿入するとき-移行、バッチ、または一括挿入など-制約をオフにします。システムを実行しているときに大量のラージを階層に挿入する必要があるインスタンスに出会ったことがないので、操作的に挿入するときは繰り返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.