query()-Methode (xml-Datentyp)

Gibt eine XQuery für eine Instanz des xml-Datentyps an. Das Ergebnis ist vom xml-Typ. Die Methode gibt eine Instanz nicht typisierten XMLs zurück.

Syntax

query ('XQuery')

Argumente

  • XQuery
    Ist eine Zeichenfolge (ein XQuery-Ausdruck), die XML-Knoten wie z. B. element- und attribute-Knoten in einer XML-Instanz abfragt.

Beispiele:

Dieser Abschnitt enthält Beispiele für das Verwenden der query()-Methode des xml-Datentyps.

A. Verwenden der query()-Methode für eine Variable vom Typ xml

Das folgende Beispiel deklariert eine Variable @myDoc vom Typ xml und weist dieser dann eine XML-Instanz zu. Die query()-Methode wird anschließend zum Angeben einer XQuery für das Dokument verwendet.

Die Abfrage ruft das untergeordnete <Features>-Element des <ProductDescription>-Elements ab:

declare @myDoc xml
set @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'
SELECT @myDoc.query('/Root/ProductDescription/Features')

Dies ist das Ergebnis:

<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>      

B. Verwenden der query()-Methode für eine Spalte vom Typ XML

Im folgenden Beispiel wird die query()-Methode zum Angeben einer XQuery für die CatalogDescription-Spalte vom Typ xml in der AdventureWorks-Datenbank verwendet.

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1

Beachten Sie hinsichtlich der vorherigen Abfrage Folgendes:

  • Die CatalogDescription-Spalte ist eine typisierte xml-Spalte. Dies bedeutet, dass ihr eine Schemaauflistung zugeordnet wurde. Im XQuery-Prolog wird das namespace-Schlüsselwort zum Definieren des Präfixes verwendet, das später im Abfragetext verwendet wird.

  • Die query()-Methode erstellt XML, ein <Product>-Element, das ein ProductModelID-Attribut besitzt, in dem der ProductModelID-Attributwert aus der Datenbank abgerufen wird. Weitere Informationen zur XML-Erstellung finden Sie unter XML-Konstruktion (XQuery).

  • Die exist()-Methode (XML-Datentyp) in der WHERE-Klausel wird zum Suchen ausschließlich nach den Zeilen verwendet, die das <Warranty>-Element im XML enthalten. Auch hier wird das namespace-Schlüsselwort zum Definieren von zwei Namespacepräfixen verwendet.

Dies ist das Teilergebnis:

<Product ProductModelID="19"/> 
<Product ProductModelID="23"/> 
...

Beachten Sie, dass die query()- und exist()-Methoden beide das PD-Präfix deklarieren. In diesen Fällen können Sie WITH XMLNAMESPACES verwenden, um zuerst die Präfixe zu definieren und dann in der Abfrage zu verwenden.

WITH XMLNAMESPACES (
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1