Freigeben über


Typensystem (XQuery)

Gilt für: SQL Server

XQuery ist eine stark typisierte Sprache für Schematypen und eine schwach typisierte Sprache für nicht typisierte Daten. Zu den vordefinierten Typen von XQuery zählen folgende Typen:

In diesem Thema wird auch Folgendes beschrieben:

Integrierte Typen des XML-Schemas

Die integrierten Typen des XML-Schemas besitzen das vordefinierte Namespacepräfix xs. Einige dieser Typen umfassen "xs:integer " und "xs:string". Alle diese integrierten Typen werden unterstützt. Sie können diese Typen verwenden, wenn Sie eine XML-Schemaauflistung erstellen.

Beim Abfragen von typisiertem XML-Code wird der statische und dynamische Typ der Knoten durch die XML-Schemaauflistung bestimmt, die der abgefragten Spalte oder Variablen zugeordnet ist. Weitere Informationen zu statischen und dynamischen Typen finden Sie unter Expression Context and Query Evaluation (XQuery). Die folgende Abfrage wird beispielsweise für eine typierte XML-Spalte (Instructions) angegeben. Der Ausdruck verwendet instance of, um zu überprüfen, ob der typisierte Wert des zurückgegebenen LotSize-Attributs den xs:decimal-Typ aufweist.

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

Diese Typisierungsinformationen werden durch die XML-Schemaauflistung bereitgestellt, die der Spalte zugeordnet sind.

Im Namespace für XPath-Datentypen definierte Typen

Die im http://www.w3.org/2004/07/xpath-datatypes Namespace definierten Typen weisen ein vordefiniertes Präfix von xdt auf. Für diese Typen gilt Folgendes:

  • Sie können diese Typen nicht verwenden, wenn Sie eine XML-Schemaauflistung erstellen. Diese Typen werden im XQuery-Typsystem verwendet und werden für XQuery und statische Typisierung verwendet. Sie können in die atomischen Typen umwandeln, z. B. xdt:untypedAtomic, im xdt-Namespace .

  • Beim Abfragen untypierter XML-Daten ist der statische und dynamische Typ von Elementknoten "xdt:untyped", und der Typ der Attributwerte lautet "xdt:untypedAtomic". Das Ergebnis einer Query() -Methode generiert untypisierte XML. Dies bedeutet, dass die XML-Knoten als xdt:untyped und xdt:untypedAtomic bzw. xdt:untypedAtomic zurückgegeben werden.

  • Die Typen "xdt:dayTimeDuration " und "xdt:yearMonthDuration " werden nicht unterstützt.

Im folgenden Beispiel wird die Abfrage für eine nicht typisierte XML-Variable angegeben. Der Ausdruck data(/a[1]) gibt eine Sequenz eines atomaren Werts zurück. Die data()-Funktion gibt den typisierten Wert des <a>-Elements zurück. Da der abgefragte XML-Code nicht typisiert ist, ist der Typ des zurückgegebenen Werts xdt:untypedAtomic. Deshalb gibt instance of den Wert True zurück.

DECLARE @x xml  
SET @x='<a>20</a>'  
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )  

Statt den typisierten Wert abzurufen, gibt der Ausdruck (/a[1]) im folgenden Beispiel eine Sequenz aus einem Element (dem <a>-Element) zurück. Der instance of-Ausdruck verwendet den Elementtest, um zu überprüfen, ob der vom Ausdruck zurückgegebene Wert ein xdt:untyped type-Elementknoten ist.

DECLARE @x xml  
SET @x='<a>20</a>'  
-- Is this an element node whose name is "a" and type is xdt:untyped.  
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')  
-- Is this an element node of type xdt:untyped.  
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')  
-- Is this an element node?  
SELECT @x.query( '/a[1] instance of element()')  

Hinweis

Wenn Sie eine typisierte XML-Instanz abfragen und der Abfrageausdruck schließt die übergeordnete Achse ein, sind die Informationen zum statischen Typ der resultierenden Knoten nicht weiter verfügbar. Der dynamische Typ ist jedoch weiterhin den Knoten zugeordnet.

Typisierter Wert im Vergleich zum Zeichenfolgenwert

Jeder Knoten besitzt einen typisierten Wert und einen Zeichenfolgenwert. Für typisierte XML-Daten wird der Typ des typisierten Werts durch die XML-Schemaauflistung bereitgestellt, die der abgefragten Spalte oder Variablen zugeordnet ist. Bei nicht typisierten XML-Daten lautet der Typ des typisierten Werts "xdt:untypedAtomic".

Sie können die Funktion data() oder string() verwenden, um den Wert eines Knotens abzurufen:

In der folgenden XML-Schemaauflistung wird das <root> Element des ganzzahligen Typs definiert:

CREATE XML SCHEMA COLLECTION SC AS N'  
<schema xmlns="http://www.w3.org/2001/XMLSchema">  
      <element name="root" type="integer"/>  
</schema>'  
GO  

Im folgenden Beispiel ruft der Ausdruck zuerst den typisierten Wert von /root[1] ab und fügt ihm anschließend 3 hinzu.

DECLARE @x xml(SC)  
SET @x='<root>5</root>'  
SELECT @x.query('data(/root[1]) + 3')  

Im nächsten Beispiel schlägt der Ausdruck fehl, weil die string(/root[1])-Anweisung im Ausdruck einen Wert des Zeichenfolgentyps zurückgibt. Dieser Wert wird dann an einen arithmetischen Operator übergeben, der nur Werte des numerischen Typs als Operand akzeptiert.

-- Fails because the argument is string type (must be numeric primitive type).  
DECLARE @x xml(SC)  
SET @x='<root>5</root>'  
SELECT @x.query('string(/root[1]) + 3')  

Im folgenden Beispiel wird der Gesamtwert der LaborHours-Attribute berechnet. Die data() Funktion ruft die eingegebenen Werte von LaborHours Attributen aus allen <Location> Elementen für ein Produktmodell ab. Gemäß dem XML-Schema, das der Instruction Spalte zugeordnet ist, LaborHours ist der Typ "xs:decimal" .

SELECT Instructions.query('   
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";   
             sum(data(//AWMI:Location/@LaborHours))   
') AS Result   
FROM Production.ProductModel   
WHERE ProductModelID=7  

Diese Abfrage gibt 12.75 als Ergebnis zurück.

Hinweis

Die explizite Verwendung der Data() -Funktion in diesem Beispiel dient nur zur Veranschaulichung. Wenn sie nicht angegeben ist, wendet sum() implizit die Data()-Funktion an, um die eingegebenen Werte der Knoten zu extrahieren.

Weitere Informationen

Vorlagen und Berechtigungen in SQL Server Profiler
XQuery-Grundlagen