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:
Integrierte Typen von XML-Schemas http://www.w3.org/2001/XMLSchema im Namespace.
Typen, die http://www.w3.org/2004/07/xpath-datatypes im Namespace definiert sind.
In diesem Thema wird auch Folgendes beschrieben:
Der Unterschied zwischen dem typisierten Wert und dem Zeichenfolgenwert eines Knotens.
Die Datenfunktion (XQuery) und die Zeichenfolgenfunktion (XQuery).
Zuordnen des von einem Ausdruck zurückgegebenen Sequenztyps
Integrierte Typen des XML-Schemas
Die integrierten Typen des XML-Schemas besitzen das vordefinierte Namespacepräfix xs. Einige dieser Typen sind 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). Beispielsweise wird die folgende Abfrage für eine typisierte 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 haben ein vordefiniertes Präfix von xdt. 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 für XQuery und statische Typisierung verwendet. Sie können im xdt-Namespace in die atomaren Typen umwandeln, z. B. xdt:untypedAtomic.
Beim Abfragen von nicht typisiertem XML ist der statische und dynamische Typ von Elementknoten xdt:untyped, und der Typ der Attributwerte ist xdt:untypedAtomic. Das Ergebnis einer query()- Methode generiert nicht typisiertes XML. Dies bedeutet, dass die XML-Knoten als xdt:untyped 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. Für nicht typisierte XML-Daten ist der Typ des typisierten Werts xdt:untypedAtomic.
Sie können die Funktion data() oder string() verwenden, um den Wert eines Knotens abzurufen:
Die Datenfunktion (XQuery) gibt den typisierten Wert eines Knotens zurück.
Die Zeichenfolgenfunktion (XQuery) gibt den Zeichenfolgenwert des Knotens zurück.
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 typisierten Werte von LaborHours
Attributen aus allen <Location
> Elementen für ein Produktmodell ab. Gemäß dem der Instruction
Spalte LaborHours
zugeordneten XML-Schema ist der Typ xs:dezimal .
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 dies nicht angegeben ist, wendet sum() implizit die data() -Funktion an, um die typisierten Werte der Knoten zu extrahieren.
Weitere Informationen
Vorlagen und Berechtigungen in SQL Server Profiler
XQuery-Grundlagen