Freigeben über


Sequenz und QNames (XQuery)

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 <step>-Elemente am ersten Arbeitsplatzstandort.

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 zum Verwenden für die 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 von Ihnen erstellte Datenbank besitzt die XML-Schemaauflistung sys. Sie reserviert diese Schemas, sodass auf sie von jeder benutzererstellten XML-Schemaauflistung zugegriffen werden kann.

HinweisHinweis

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

Siehe auch

Andere Ressourcen

XQuery-Grundlagen