Удаление узлов с определенным значением из XML с помощью TSQL

Я пытаюсь разобрать часть 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 *'

2 ответов


попробовать

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


    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