Как изменить несколько узлов с помощью SQL XQuery в MS SQL 2005 - PullRequest
3 голосов
/ 05 августа 2009

В таблице у меня есть следующее.

ParameterID (int)    ParameterValue (XML)
------------    --------------
1               <USER><User ID="1" Name="Billy"/><USER>
                <USER><User ID="2" Name="Billy"/><USER>
                <MANAGER><User ID="1" Name="Billy"/><MANAGER>
2               <USER><User ID="1" Name="John"/><USER>
                <USER><User ID="2" Name="Billy"/><USER>
                <MANAGER><User ID="1" Name="Billy"/><MANAGER>
3               <USER><User ID="1" Name="David"/><USER>
                <USER><User ID="2" Name="Billy"/><USER>
                <MANAGER><User ID="1" Name="Billy"/><MANAGER>

Как мне изменить все экземпляры Билли на Питера?

Я пытался

-- Update the table         
UPDATE  @tbXML
SET     ParameterValue.modify('replace value of (//User/@Name[.="Billy"])[1] with "Peter"')

Но обновился только первый Билли в ряду.

Запуск обновления несколько раз:

For Row 1: 
1st Time = 1 <USER><User ID="1" Name="Peter"/><USER> <USER><User ID="2" Name="Billy"/><USER> <MANAGER><User ID="1" Name="Billy"/><MANAGER> 

2nd Time 1 <USER><User ID="1" Name="Peter"/><USER> <USER><User ID="2" Name="Peter"/><USER> <MANAGER><User ID="1" Name="Billy"/><MANAGER> 

3rd Time 1 <USER><User ID="1" Name="Peter"/><USER> <USER><User ID="2" Name="Peter"/><USER> <MANAGER><User ID="1" Name="Peter"/><MANAGER>

Ответы [ 2 ]

1 голос
/ 05 августа 2009

«Простым» подходом было бы преобразовать столбец XML в VARCHAR (MAX) и просто выполнить ЗАМЕНУ для него:

UPDATE
  YourTable
SET
  ParameterValue = CAST(REPLACE(CAST(ParameterValue AS VARCHAR(MAX)), '
                                Billy', 'Peter') AS XML)
WHERE
  ....

Похоже, что вы не можете обновить несколько значений узлов XML в одном операторе UPDATE, как объясняет Ричард Сзалай здесь :

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

Так что я думаю, вам придется либо использовать упомянутый выше подход "тупой" VARCHAR (MAX), либо выполнить обновление в цикле (пока вы все еще находите узел с "billy", ОБНОВИТЕ этот узел для чтения " Питер "вместо).

Марк

0 голосов
/ 06 августа 2009

Я использовал курсор для обновления

Использовал обновление в ответе marcs в курсоре в цикле while

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...