2009-10-14 3 views
3

Я пытаюсь без везения создать инструкцию modify(), чтобы изменить значение атрибута во всех элементах, имеющих это значение атрибута, - пока я могу получить его только для изменения значения в первом совпадающем элементе. Я создал пример ниже того, что я до сих пор, что я бегу в SQL Server 2005:Как заменить значение атрибута * всех * соответствующих элементов с помощью XQuery?

DECLARE @x XML 
SELECT @x = ' 
<FootballApparel> 
    <Item Team="Phoenix Cardinals" Type="Hat" Cost="$14.99" /> 
    <Item Team="Indianapolis Colts" Type="Hat" Cost="$14.99" /> 
    <Item Team="Cincinnati Bengals" Type="Hat" Cost="$14.99" /> 
    <Item Team="Phoenix Cardinals" Type="Shirt" Cost="$21.99" /> 
    <Item Team="Indianapolis Colts" Type="Shirt" Cost="$21.99" /> 
    <Item Team="Cincinnati Bengals" Type="Shirt" Cost="$21.99" /> 
</FootballApparel> 
'; 

SET @x.modify(' 
    replace value of 
    (/FootballApparel/Item[@Team="Phoenix Cardinals"]/@Team)[1] 
    with "Arizona Cardinals" 
'); 

SELECT @x; 

Запуск это дает приведенные ниже результаты - только первый экземпляр Phoenix кардиналами был изменен.

<FootballApparel> 
    <Item Team="Arizona Cardinals" Type="Hat" Cost="$14.99" /> 
    <Item Team="Indianapolis Colts" Type="Hat" Cost="$14.99" /> 
    <Item Team="Cincinnati Bengals" Type="Hat" Cost="$14.99" /> 
    <Item Team="Phoenix Cardinals" Type="Shirt" Cost="$21.99" /> 
    <Item Team="Indianapolis Colts" Type="Shirt" Cost="$21.99" /> 
    <Item Team="Cincinnati Bengals" Type="Shirt" Cost="$21.99" /> 
</FootballApparel> 

Не могли бы вы помочь мне с правильной инструкцией modify() для замены всех экземпляров?

Спасибо!
Kevin

ответ

5

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

WHILE @x.exist('(/FootballApparel/Item[@Team=sql:variable("@oldTeamName")])[1]') = 1 
SET @x.modify(' 
    replace value of (
    /FootballApparel/Item[@Team=sql:variable("@oldTeamName")]/@Team 
)[1] 
    with sql:variable("@newTeamName") 
'); 

Это должен сделать трюк.

Marc

+0

Привет, Марк, мне нужно обновить несколько узлов в базе данных. так можно ли с помощью одной инструкции xml? или мне нужно написать заявление, которое вы объяснили выше для всех узлов? – Radhi

+0

@Radhi: можете ли вы выбрать все эти узлы в XML в одном выражении XPath? Если да, вы можете обновить их за одну операцию; в противном случае вам потребуется несколько операций «изменить» –

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