Sie können versuchen, zu folgen
SELECT @xml.query('
element a {
for $node in /a/*[local-name() != "d"]
return $node
}');
Es ist jedoch möglicherweise nicht geeignet, wenn Ihr echtes XML komplexer ist und Sie Knoten auf einer tieferen Verschachtelungsebene ausschließen müssen.
Ehrlich gesagt denke ich nicht, dass XQuery das gute Werkzeug für solche Aufgaben ist. Im Wesentlichen haben wir XML und wir müssen einen Knoten irgendwo innerhalb entfernen, dh wir müssen ihn transformieren . Das geeignetere Werkzeug sind meiner Meinung nach XSL-Transformationen. SQL Server verfügt leider nicht über integrierte XSLT-Funktionen (kann jedoch über die SQLCLR-Funktion hinzugefügt werden).
So könnte XSL zur Lösung dieser Aufgabe aussehen
<!-- Skip "d" under "a" -->
<xsl:template match="a/d" />
<!-- Apply identity transform to other nodes -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
Es funktioniert für a
Elemente, die sich an einer beliebigen Stelle in XML befinden, nicht nur im Stammverzeichnis.
Die SQLCLR-Funktion zum Durchführen einer nicht parametrisierten XSL-Transformation kann so einfach wie wenige Zeilen C # -Code sein
[SqlFunction(Name = "XslTransform")]
public static SqlXml XslTransform(SqlXml xml, SqlXml xsl)
{
if (xml.IsNull || xsl.IsNull)
return SqlXml.Null;
var xslt = new XslCompiledTransform();
using (var xr = xsl.CreateReader())
xslt.Load(xr);
var xws = new XmlWriterSettings
{
Encoding = Encoding.Unicode,
OmitXmlDeclaration = true
};
var output = new MemoryStream();
using (var xw = XmlWriter.Create(output, xws))
using (var xr = xml.CreateReader())
{
xslt.Transform(xr, null, xw);
xw.Flush();
}
output.Seek(0, SeekOrigin.Begin);
return new SqlXml(output);
}
Es sollte in der Datenbank wie deklariert werden
CREATE FUNCTION SQLCLR.XslTransform
(
@xml xml,
@xsl xml
)
RETURNS xml
AS EXTERNAL NAME [AssemblyName].[ClassName].[XslTransform];
GO
Und es kann dann als verwendet werden
DECLARE
@xml xml = N'(Your XML goes here)',
@xsl xml = N'(Your XSL goes here)';
SELECT SQLCLR.XslTransform(@xml, @xsl);