【问题标题】:Filter XML node based on multiple xml attributes for update根据多个 xml 属性过滤 XML 节点以进行更新
【发布时间】:2013-10-07 20:44:12
【问题描述】:

在下面的查询中,我正在更新数据库中表 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节点,然后更新这个节点的值?

【问题讨论】:

    标签: sql-server xml tsql xml-dml


    【解决方案1】:

    您可以在谓词中使用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")
    ')
    

    【讨论】:

      【解决方案2】:
      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 变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        相关资源
        最近更新 更多