Можно ли с помощью T-SQL переместить узел XML с помощью одной инструкции, вместо того, чтобы выполнять insert, за которым следует delete?
Пример XML ...
DECLARE @XML XML = '<data><a></a><b></b></data>'
Желаемый XML ...
DECLARE @XML XML = '<data><a><b></b></a></data>'
Двухэтапное решение ...
SET @XML.modify('insert (/data/b) as last into (/data/a)[1]')
SET @XML.modify('delete (/data/b)')
Есть ли одношаговое решение?
Извините @scsimon, но это серьезный вопрос? Я не строю "примерный" XML ... Я конвертирую его. Если бы я строил его в первую очередь, как вы думаете, я бы специально поместил его не в то место, чтобы потом переместить?
Ваш пример очень упрощен (это хорошо), но будет ли ваш XML реальная жизнь такой же по структуре (переместите один элемент уровень 2 в один элемент 1-й уровень)? Или нужен полностью раскрытый-универсальный-двигаться-отсюда-туда-магия?
@Shnugo - какое это имеет значение? Один элемент уровня 1 будет перемещен в один элемент уровня 3, но, AFAIK, это не должно иметь никакого значения для вопроса / ответа. Честно говоря, мое двухэтапное решение работает ... Меня просто интересовало (для крошечного увеличения производительности, но в основном для личных знаний), была бы одна команда .modify, которая бы это сделала
Нет, нет ... .modify() допускает одно единственное изменение для каждого звонка. В зависимости от фактического XML его можно 1) измельчить и перестроить, попробовать какой-нибудь модный XQuery, но в целом это не сработает.
@Shnugo - достаточно честно. Сделайте ответ, и я помечу его как принятый
@freefaller Я постоянно вижу, как люди задают вопрос и излишне упрощают его только для того, чтобы получить простой ответ, например, опубликованный shnug, а затем сказать «ну на самом деле ...», так что да, это была серьезная попытка заставить вас опубликовать настоящий xml или объяснить вопрос больше. Очевидно, в данном случае в этом не было необходимости.
@scsimon - понял. Я занимаюсь разработкой более 20 лет, поэтому знаю о подобных подводных камнях. Я не мог сосчитать, сколько раз я начинал писать вопросы, которые становились вовлеченными так из-за их сложности, от которых я отказался, опасаясь, что они станут TL; DR :-)
Достаточно честно @freefaller
@freefaller О вашем чисто интересно (для крошечного прироста производительности, но в основном для личных знаний): Это то, что я тоже хотел бы иметь ... Необходимость в двух утверждениях часто делает разницу между для этого случая и процессуальный - чего я стараюсь избегать ...





Как вы просили меня разместить свой комментарий в качестве ответа:
Нет, нет ...
.modify() допускает одно единственное изменение за звонок.
В зависимости от фактического XML можно
XQuery (но TSQL XQuery очень ограничен созданным XML ...)Оба не будут работать в целом.
Я запутался, почему бы сначала не вставить правильно? Под правильным я подразумеваю то, что вы хотите.