Чи є на основі способу завантаження / читання гілки дерева за допомогою HierarchyId


11

Я граю з HierarchyId, і я не з'ясував набір способів зробити наступне:

  • вставити відразу все піддірево
  • отримати відразу все піддірево

Це питання пов'язане з моїм попереднім , і я підозрюю, що єдиний спосіб виконання цих двох завдань за допомогою HierarchyId - це один вузол або один рівень за один раз. Якщо я використовую матеріалізований шлях, обидві дії легко виконуються однією (і тривіальною) командою на основі набору.

Що я пропускаю?

Редагувати: Я також пропустив спосіб переміщення піддерева, але це я дізнався з коментаря Мікаеля Ерікссона



@MikaelEriksson Ви можете зробити свій коментар відповіддю?
АК

2
Звичайно. Я також трохи розробив, як я розумію, що відбувається. До речі, я лише трохи тестував HierarchyId, ніколи не використовував його у виробництві.
Мікаель Ерікссон

Відповіді:


5

Використовувана функція - GetReparentedValue, але при використанні лише GetReparentedValueдерево може виявитися в "непослідовному" стані.

Ось код, наданий корпорацією Майкрософт, який опікується цим питанням. Рухомі підкресли .

Я здогадуюсь, що пов’язане з цим - Закріплення дерева . Він використовує розрахований стовпець для батьківського ідентифікатора, який самостійно приєднується до ПК.


Це найкраща відповідь поки що. На жаль, я не бачу способу вставити / вибрати підрівень більше одного рівня в одній команді.
АК

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

Вставлення складніше, але ваша основна проблема буде з вашими обмеженнями - ви, очевидно, не можете вставити дочірні об’єкти, поки їх батьків не буде вчинено. У цьому випадку або повторіть і вставте в ієрархічному порядку, або вимкніть обмеження та вставляйте.

Коли ви вставляєте велику кількість даних - міграцію, пакетну або масову вставку тощо - я б вимкнув обмеження. Під час оперативної вставки я б повторював, оскільки я не стикався з випадками під час роботи системи, коли в ієрархію потрібно вставляти велику кількість великих розмірів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.