使用 TSQL 从 XML 中删除具有特定值的节点
Posted
技术标签:
【中文标题】使用 TSQL 从 XML 中删除具有特定值的节点【英文标题】:Delete nodes with certain value from XML using TSQL 【发布时间】: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 *'
【问题讨论】:
【参考方案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
【讨论】:
以上是关于使用 TSQL 从 XML 中删除具有特定值的节点的主要内容,如果未能解决你的问题,请参考以下文章
使用正则表达式从字符串中删除属性值不是特定值的所有 xml 节点
不能只删除链接列表中的最后一个元素! (所有其他具有特定值的元素都会被删除)