在下面的查询中,我正在更新数据库中表 X 的"项目"列中的 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 节点,然后更新此节点的值?
您可以在谓词中使用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")
')
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。