使用TSQL从XML中删除具有特定值的节点

时间:2013-02-25 16:48:30

标签: sql-server xml tsql contains

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

这确实可以删除:

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

但我想删除“Message”节点只包含文本的位置,如:

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 *'

2 个答案:

答案 0 :(得分:19)

尝试

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

答案 1 :(得分:3)

    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