基于多个xml属性过滤XML节点以进行更新

时间:2013-10-01 15:40:04

标签: sql-server xml tsql xml-dml

在下面的查询中,我正在更新数据库中表X的Items列中的xml节点中的值。现在我只根据Name属性进行过滤。因为有多个节点具有相同的名称,所以我需要能够在更新期间过滤更多属性。

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 个答案:

答案 0 :(得分: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")
')

答案 1 :(得分: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的属性和一个@newParam的新sql变量。