Есть ли установленный способ загрузки / чтения ветви дерева с HierarchyId

11

Я играю с HierarchyId, и я не нашел способ, основанный на множестве, чтобы сделать следующее:

  • вставить все поддерево сразу
  • получить все поддерево одновременно

Этот вопрос связан с моим предыдущим , и я подозреваю, что единственный способ выполнить эти две задачи с HierarchyId - это один узел или один уровень за раз. Если я использую материализованный путь, оба действия легко выполняются одной (и тривиальной) командой на основе набора.

Что мне не хватает?

Изменить: я также пропустил способ перемещения поддерева, но я узнал об этом из комментария Микаэля Эрикссона

Аляска
источник
2
Вы видели это? Перемещение поддеревьев
Микаэль Эрикссон
@MikaelEriksson Вы можете сделать свой комментарий ответом?
АК
2
Конечно. Я также подробно рассказал о том, как я понимаю, что происходит. Кстати, я только немного протестировал HierarchyId, никогда не использовал его в работе.
Микаэль Эрикссон

Ответы:

5

Используемая функция - GetReparentedValue, но при использовании только GetReparentedValueдерева может оказаться в «несовместимом» состоянии.

Вот некоторый код, предоставленный Microsoft, который заботится об этом. Перемещение поддеревьев .

Я думаю, что это связано с применением дерева . Он использует вычисляемый столбец для родительского идентификатора, который самостоятельно присоединяется к PK.

Микаэль Эрикссон
источник
Это лучший ответ на данный момент. К сожалению, я не вижу способа вставить / выбрать поддерево нескольких уровней в одной команде.
АК
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

Вставка является более сложной, но ваша основная проблема будет связана с вашими ограничениями - вы, очевидно, не можете вставить дочерние объекты, пока их родитель не будет зафиксирован. В этом случае либо выполните итерацию и вставку в иерархическом порядке, либо отключите ограничения и вставьте.

При вставке большого количества данных - миграции, пакетной или массовой вставки и т. Д. - я бы отключил ограничение. При оперативной вставке я бы выполнял итерацию, так как я не сталкивался с экземплярами во время работы системы, когда большие объемы больших объемов должны быть вставлены в иерархию.

Кирк Бродхерст
источник