2013-10-01 2 views
1

В следующем ниже вопросе я обновляю значение в узле xml в столбце Items в таблице X в базе данных. Сейчас я фильтрую только на атрибут Name. Поскольку есть несколько узлов с тем же именем, мне нужно иметь возможность фильтровать больше атрибутов во время обновления.Фильтровать узел XML на основе нескольких атрибутов xml для обновления

UPDATE dbo.Declarations 
    SET Items.modify('replace value of 
(/Items/Item[@Name=(sql:variable("@ItemName"))]/text())[1] 
with sql:variable("@Value")') 
    WHERE DeclarationId = @DeclarationId 
END 

Можно ли выбрать узел XML на основе нескольких значений атрибутов, а затем обновить значение этого узла?

ответ

2

Вы можете использовать and в предикате и добавить дополнительные проверки.

declare @X xml = ' 
<Items> 
    <Item Name = "Name1" Type = "Type1">Value1</Item> 
    <Item Name = "Name2" Type = "Type2">Value2</Item> 
</Items> 
' 

declare @Value varchar(10) = 'NewValue2' 
declare @Name varchar(10) = 'Name2' 
declare @Type varchar(10) = 'Type2' 

set @X.modify(' 
    replace value of (/Items/Item[ 
           @Name = sql:variable("@Name") and 
           @Type = sql:variable("@Type") 
           ]/text())[1] 
    with sql:variable("@Value") 
') 
+0

Огромное спасибо! – Chivan

0
UPDATE dbo.Declarations 
    SET Items.modify('replace value of 
(/Items/Item[@Name=(sql:variable("@ItemName"))][@Attr=(sql:variable("@newParam"))]/text())[1] 
with sql:variable("@Value")') 
    WHERE DeclarationId = @DeclarationId 
END 

Необходимо сделать это; предполагая, что у вас есть атрибут Attr и новая переменная sql от @newParam.

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