12

I'm trying to parse a piece of XML and remove nodes that contain certain values. I know how to remove them if the value is exact, but I want to use something like a "contains".

This works to delete exactly:

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

But I want to delete where the "Message" node just contains the text, something like:

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

However this returns the error:

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

2 Answers 2

23

Try

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

to delete the <message/> element and its contents

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

to delete the <message/> element's contents.

Example here http://msdn.microsoft.com/en-us/library/ms178026.aspx

Sign up to request clarification or add additional context in comments.

1 Comment

Prefect. I'd got to something very similar, but it was a 2 step. Delete the contents of the node, and then delete empty nodes. This is much more elegant.
6
    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")]')

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.