【问题标题】:Delete nodes with certain value from XML using TSQL使用 TSQL 从 XML 中删除具有特定值的节点
【发布时间】:2013-02-10 21:26:17
【问题描述】:

我正在尝试解析一段 XML 并删除包含某些值的节点。如果值是准确的,我知道如何删除它们,但我想使用“包含”之类的东西。

这可以完全删除:

update @XML set data.modify('delete //Message[text() = "customer has deleted their account"]')

但我想删除“消息”节点仅包含文本的位置,例如:

update @XML set data.modify('delete //Message[contains(text(), "customer")]')

但是这会返回错误:

XQuery [@XML.data.modify()]: 'contains()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

【问题讨论】:

    标签: sql-server xml tsql contains


    【解决方案1】:

    试试

    update @XML set data.modify('delete //Message[text()][contains(.,"customer")]')
    

    删除<message/> 元素及其内容

    update @XML set data.modify('delete //Message//text()[contains(.,"customer")]')
    

    删除<message/> 元素的内容。

    这里的例子http://msdn.microsoft.com/en-us/library/ms178026.aspx

    【讨论】:

    • 级长。我得到了一些非常相似的东西,但这是一个 2 步。删除节点的内容,然后删除空节点。这更优雅。
    【解决方案2】:
        declare @XML xml = '
        <Root>
          <Sub>
            <Record>
              <Guid>aslkjflaksjflkasjfkljsd</Guid>
            </Record>
            <Record>
               <Guid>opqiwuerl;kasdlfkjawop</Guid>
            </Record>
          </Sub>
        </Root>'
    
    declare @Guid varchar(30) = 'aslkjflaksjflkasjfkljsd'
    
    set @XML.modify('delete /Root/Sub/Record[Guid = sql:variable("@Guid")]')
    

    参考 https://dba.stackexchange.com/questions/40039/how-to-return-xml-node-ordinal-or-delete-node-based-on-element-value

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多