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

问题描述:

我试图解析一段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 *' 

尝试

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

+0

级长。我得到了非常相似的东西,但是这只是两步。删除节点的内容,然后删除空节点。这更优雅。 – 2013-02-25 18:34:26

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