Sequenz und QNames (XQuery)

Gilt für:SQL Server

In diesem Thema werden die folgenden grundlegenden Konzepte von XQuery beschrieben:

  • Sequenz

  • QNames und vordefinierte Namespaces

Sequenz

In XQuery ist das Ergebnis eines Ausdrucks eine Sequenz, die aus einer Liste von XML-Knoten und aus Instanzen von atomaren XSD-Typen besteht. Ein einzelner Eintrag in einer Sequenz wird als ein Item bezeichnet. Ein Item in einer Sequenz kann einem der folgenden Typen entsprechen:

  • Ein Knoten, wie z. B. ein Element, Attribut, Text, eine Verarbeitungsanweisung, ein Kommentar oder Dokument

  • Ein atomarer Wert, z. B. eine Instanz eines einfachen XSD-Typs

Die folgende Abfrage konstruiert z. B. eine Sequenz aus zwei Elementknotenelementen:

SELECT Instructions.query('  
     <step1> Step 1 description goes here</step1>,  
     <step2> Step 2 description goes here </step2>  
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7;  
  

Dies ist das Ergebnis:

<step1> Step 1 description goes here </step1>  
<step2> Step 2 description goes here </step2>   

In der vorigen Abfrage ist das Komma (,) am Ende der <step1>-Konstruktion der erforderliche Sequenzkonstruktor. Die Leerzeichen in den Ergebnissen wurden nur zur Veranschaulichung hinzugefügt und sind in allen Beispielergebnissen in dieser Dokumentation enthalten.

Es folgen einige Zusatzinformationen zum Konzept der Sequenzen:

  • Wenn eine Abfrage zu einer Sequenz führt, die eine andere Sequenz enthält, so wird die enthaltene Sequenz in der Containersequenz vereinfacht. So wird die Sequenz ((1,2, (3,4,5)),6) z. B. im Datenmodell zu (1, 2, 3, 4, 5, 6) vereinfacht.

    DECLARE @x xml;  
    SET @x = '';  
    SELECT @x.query('(1,2, (3,4,5)),6');  
    
  • Eine leere Sequenz ist eine Sequenz, die kein Item enthält. Das wird als "()" dargestellt.

  • Eine Sequenz mit nur einem Item kann als ein atomarer Wert behandelt werden und umgekehrt. Das heißt: (1) = 1.

In dieser Implementierung muss die Sequenz homogen sein. Das heißt, dass eine Sequenz entweder ganz aus atomaren Werten oder aus Knoten bestehen kann. So sind z. B. die folgenden Sequenzen gültig:

DECLARE @x xml;  
SET @x = '';  
-- Expression returns a sequence of 1 text node (singleton).  
SELECT @x.query('1');  
-- Expression returns a sequence of 2 text nodes  
SELECT @x.query('"abc", "xyz"');  
-- Expression returns a sequence of one atomic value. data() returns  
-- typed value of the node.  
SELECT @x.query('data(1)');  
-- Expression returns a sequence of one element node.   
-- In the expression XML construction is used to construct an element.  
SELECT @x.query('<x> {1+2} </x>');  

Die folgende Abfrage gibt einen Fehler zurück, weil heterogene Sequenzen nicht unterstützt werden.

SELECT @x.query('<x>11</x>, 22');  

QName

Jeder Bezeichner in einer XQuery-Abfrage ist ein QName. Ein QName besteht aus einem Namespacepräfix und einem lokalen Namen. In dieser Implementierung sind die XQuery-Variablennamen QNames, und sie können keine Präfixe besitzen.

Betrachten Sie das folgende Beispiel, in dem eine Abfrage für eine nicht typisierte xml-Variable angegeben wird:

DECLARE @x xml;  
SET @x = '<Root><a>111</a></Root>';  
SELECT @x.query('/Root/a');  

Im Ausdruck (/Root/a) sind Root und a QNames.

Im folgenden Beispiel wird eine Abfrage für eine typisierte XML-Spalte angegeben. Die Abfrage durchläuft alle <Schrittelemente> am ersten Arbeitscenterstandort.

SELECT Instructions.query('  
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
for $Step in /AWMI:root/AWMI:Location[1]/AWMI:step  
      return  
           string($Step)   
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7;  

Beachten Sie im Abfrageausdruck Folgendes:

  • AWMI root, AWMI:Location, AWMI:step und $Step sind jeweils QNames. AWMI ist ein Präfix, und root, Location und Step sind lokale Namen.

  • Die $step-Variable ist ein QName und besitzt kein Präfix.

Die folgenden Namespaces sind für die Verwendung mit XQuery-Unterstützung in SQL Server vordefiniert.

Präfix URI
xs http://www.w3.org/2001/XMLSchema
xsi http://www.w3.org/2001/XMLSchema-instance
xdt http://www.w3.org/2004/07/xpath-datatypes
fn http://www.w3.org/2004/07/xpath-functions
(kein Präfix) urn:schemas-microsoft-com:xml-sql
sqltypes https://schemas.microsoft.com/sqlserver/2004/sqltypes
Xml http://www.w3.org/XML/1998/namespace
(kein Präfix) https://schemas.microsoft.com/sqlserver/2004/SOAP

Jede datenbank, die Sie erstellen, verfügt über die sys XML-Schemaauflistung. Sie reserviert diese Schemas, sodass auf sie von jeder benutzererstellten XML-Schemaauflistung zugegriffen werden kann.

Hinweis

Diese Implementierung unterstützt das local Präfix nicht, wie in der XQuery-Spezifikation in http://www.w3.org/2004/07/xquery-local-functionsbeschrieben.

Weitere Informationen

XQuery-Grundlagen