XQuery-Prolog

Eine XQuery-Abfrage besteht aus einem Prolog und einem Hauptteil (Body). Der XQuery-Prolog besteht aus einer Serie von Deklarationen und Definitionen, die gemeinsam die für die Verarbeitung der Abfrage erforderliche Umgebung erstellen. In SQL Server kann der XQuery-Prolog Namespacedeklarationen enthalten. Der XQuery-Hauptteil besteht aus einer Sequenz von Ausdrücken, die das beabsichtigte Abfrageergebnis angeben.

Die folgende XQuery-Abfrage ist z. B. für die Instructions-Spalte vom xml-Typ angegeben, in der Produktionsanweisungen als XML gespeichert sind. Die Abfrage ruft die Produktionsanweisungen für den Arbeitsplatzstandort 10 ab. Um die XQuery-Abfrage anzugeben, wird die query()-Methode des xml-Datentyps verwendet.

SELECT Instructions.query('declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";         
    /AWMI:root/AWMI:Location[@LocationID=10]
') AS Result 
FROM  Production.ProductModel
WHERE ProductModelID=7

Die obige Abfrage besitzt folgende Merkmale:

  • Der XQuery-Prolog enthält eine Namespacepräfixdeklaration (AWMI): (namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";.

  • Das declare namespace-Schlüsselwort definiert ein Namespacepräfix, das später im Hauptteil der Abfrage verwendet wird.

  • /AWMI:root/AWMI:Location[@LocationID="10"] ist der Hauptteil der Abfrage.

Namespacedeklarationen

Eine Namespacedeklaration definiert ein Präfix und ordnet dieses einem Namespace-URI zu, was in der folgenden Abfrage dargestellt ist. In der Abfrage ist CatalogDescription eine xml-Typspalte.

Indem die XQuery-Abfrage für die Spalte angegeben wird, gibt der Abfrageprolog mit der declare namespace-Deklaration an, dass das Präfix PD, die Produktbeschreibung, dem Namespace-URI zugeordnet wird. Dieses Präfix wird dann im Hauptteil der Abfrage anstelle der Namespace-URI verwendet. Die Knoten des daraus resultierenden XML befinden sich in dem dem Namespace-URI zugeordneten Namespace.

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
         /PD:ProductDescription/PD:Summary 
    ') as Result
FROM Production.ProductModel
where ProductModelID=19

Um die Lesbarkeit der Abfrage zu verbessern, können Sie Namespaces mit WITH XMLNAMESPACES deklarieren, statt die Präfix- und Namespacebindung mit declare namespace im Abfrageprolog zu deklarieren.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)

SELECT CatalogDescription.query('
         /PD:ProductDescription/PD:Summary 
    ') as Result
FROM Production.ProductModel
where ProductModelID=19

Weitere Informationen finden Sie unter Hinzufügen von Namespaces mithilfe von WITH XMLNAMESPACES.

Standardnamespacedeklaration

Statt ein Namespacepräfix mit der declare namespace-Deklaration zu deklarieren, können Sie die declare default element namespace-Deklaration verwenden, um einen Standardnamespace für Elementnamen zu binden. In diesem Fall definieren Sie kein Präfix.

Im folgenden Beispiel gibt der Pfadausdruck der Abfrage kein Namespacepräfix an. Standardmäßig gehören alle Elementnamen zu dem im Prolog angegebenen Standardnamespace.

SELECT CatalogDescription.query('
     declare default element namespace  "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
        /ProductDescription/Summary 
    ') as Result
FROM  Production.ProductModel
WHERE ProductModelID=19 

Einen Standardnamespace können Sie mit WITH XMLNAMESPACES deklarieren:

WITH XMLNAMESPACES (DEFAULT 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription')
SELECT CatalogDescription.query('
        /ProductDescription/Summary 
    ') as Result
FROM  Production.ProductModel
WHERE ProductModelID=19