2010-11-24 2 views
1

Мне нужно создать хранимую процедуру sql (Sql Server 2008 - T-SQL), которая копирует узел в модели смежности.Копирование в смежности модели

Стол можно увидеть как имеющий две колонки: Id и ParentId (от FK до Id). Копирование означает, что все подчиненные должны быть скопированы.

Я думаю, что использование WITH - хорошее начало, но мне любопытно, могу ли я сделать эту копию без использования курсоров.

ответ

1

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

Если возможно, переносите свой список смежности в модель вложенного набора, которая позволяет легко идентифицировать все узлы поддерева. Однако обслуживание вложенной модели набора более сложно для общих вставок и удалений.

EDIT: Как указано «a_horse_with_no_name» : способ в целом SQL для обработки списков смежности, рекурсивных общих табличных выражений.

+0

Ну, я фактически конвертирую мою вложенную модель набора в список смежности, потому что у нас возникают серьезные проблемы с производительностью при вставке узлов (для одной вставки требуется в среднем 50 000 обновлений). – 2010-11-24 13:35:50

0

Копирование всей суб-дерево немного проблемы, потому что, когда вы скопировать поддерево вы либо

  • денормализации данных или
  • , используя его в качестве шаблона некоторых сортов.

В любом случае вы тащите данные через неустойчивое состояние в каком-то момент - что указует на некоторые проблемы с вашим дизайном (например, сделать ваши записи должны иметь несколько родителей или нет, если да, то вам следует рассмотреть вопрос реорганизация?) ,

Итак, вы должны обновить ответ более полным примером того, что вы пытаетесь сделать.

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

Так

  1. с вкладышем в временную таблицу
  2. UPDATE идентификаторы
  3. ВСТАВИТЬ в исходную таблицу
  4. УДАЛЕНИЯ временных записей

Процедура должна идти, как это потому, что он было бы сложно изменить идентификаторы (оба идентификатора записи и идентификатор, относящиеся к родительскому элементу), вначале WITH INSERT. Однако было бы возможно, если бы была хорошая функция, зависящая только от max_id или только от старых идентификаторов.

Смежные вопросы