SET NOCOUNT ON;
DECLARE @xml AS Xml = '<a><b>bbb</b><c>ccc</c><d>ddd</d></a>';
SELECT @xml;
SELECT @xml.query('/a/*[self::b or self::c]');
SET @xml.modify('delete /a/d');
SELECT @xml;
给出以下结果集
原来的:
<a><b>bbb</b><c>ccc</c><d>ddd</d></a>
过滤以排除非 (b|c) - 但缺少父母:
<b>bbb</b><c>ccc</c>
我想要的(可用于删除步骤,但不可用于 .query):
<a><b>bbb</b><c>ccc</c></a>
是否可以在 XQuery 中保留父母?
您可以尝试以下
但是,如果您的真实 XML 更复杂并且您必须在更深层次的嵌套中排除节点,则它可能不适合。
老实说,我不认为 XQuery 是处理这类任务的好工具。本质上,我们有 XML,我们需要删除其中的某个节点,即我们需要对其进行转换。我认为更合适的工具是 XSL 转换。不幸的是,SQL Server 没有内置的 XSLT 功能(不过,它可以通过 SQLCLR 函数添加)。
这就是解决此任务的 XSL 主体的外观
它适用于
a
驻留在 XML 中任何位置的元素,而不仅仅是根。用于执行非参数化 XSL 转换的 SQLCLR 函数可以像几行 C# 代码一样简单
它应该在数据库中声明,如
然后它可以用作