Sql-Server
是否有一種基於集合的方式來載入/讀取帶有 HierarchyId 的樹枝
我正在玩 HierarchyId,但我還沒有找到一種基於集合的方法來執行以下操作:
- 一次插入所有子樹
- 一次檢索所有子樹
這個問題與我之前的問題有關,我懷疑使用 HierarchyId 完成這兩項任務的唯一方法是一次一個節點或一個級別。如果我使用物化路徑,這兩個操作都可以通過單個(且微不足道的)基於集合的命令輕鬆完成。
我錯過了什麼?
編輯:我也錯過了移動子樹的方法,但我是從 Mikael Eriksson 的評論中學到的
要使用的函式是GetReparentedValue,但僅
GetReparentedValue
使用樹時可能會處於“不一致”狀態。這是 Microsoft 提供的一些程式碼來處理這個問題。移動子樹。
我想與此相關的是Enforcing a tree。它為父 ID 使用計算列,該列執行自聯接到 PK。
檢索整個子樹很簡單 -
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
插入更複雜,但您的主要問題將是您的約束 - 您顯然不能插入子對象,直到它們的父對像被送出。在這種情況下,要麼迭代並按層次順序插入,要麼關閉約束並插入。
當插入大量數據時——遷移、批量或批量插入等——我會關閉約束。在操作插入時,我會迭代,因為在系統執行期間我沒有遇到需要將大量大數據插入層次結構的實例。