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;
Fornece os seguintes conjuntos de resultados
Original:
<a><b>bbb</b><c>ccc</c><d>ddd</d></a>
Filtrado para excluir não--(b|c) - mas os pais estão ausentes:
<b>bbb</b><c>ccc</c>
O que eu quero (disponível com etapas de exclusão, mas não com .query):
<a><b>bbb</b><c>ccc</c></a>
É possível preservar os pais em um XQuery?
Você pode tentar seguir
Mas pode não ser adequado se o seu XML real for mais complexo e você precisar excluir o nó em um nível mais profundo de aninhamento.
Falando honestamente, não acho que o XQuery seja a boa ferramenta para esse tipo de tarefa. Em essência, temos XML e precisamos remover um nó em algum lugar dentro, ou seja, precisamos transformá -lo. A ferramenta mais adequada, eu acho, são as transformações XSL. Infelizmente, o SQL Server não possui recursos XSLT integrados (mas pode ser adicionado por meio da função SQLCLR).
É assim que o corpo do XSL para resolver esta tarefa pode parecer
Ele funcionará para o
a
elemento que reside em qualquer lugar dentro do XML, não apenas na raiz.A função SQLCLR para realizar a transformação XSL não parametrizada pode ser tão simples quanto algumas linhas de código C#
Deve ser declarado no banco de dados como
E pode ser usado então como