Freigeben über


Typensystem (XQuery)

XQuery ist eine streng 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 schließen xs:integer und xs:string ein. 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 Ausdruckskontext und Ausdrucksauswertung (XQuery). Die folgende Abfrage wird z. B. 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. Weitere Informationen finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks-Datenbank.

Im Namespace für XPath-Datentypen definierte Typen

Die im **http://www.w3.org/2004/07/xpath-datatypes**-Namespace definierten Typen besitzen das vordefinierte Präfix 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-Typisierungssystem verwendet und zur statischen Typisierung genutzt. Sie können eine Umwandlung in die atomaren Typen, z. B. von xdt:untypedAtomic, im xdt-Namespace durchführen.
  • Beim Abfragen von nicht typisiertem XML-Code ist der statische und dynamische Typ der Elementknoten xdt:untyped, und der Typ der Attributwerte ist xdt:untypedAtomic. Das Ergebnis einer query()-Methode generiert nicht typisierten XML-Code. Das bedeutet, dass die XML-Knoten als xdt:untyped bzw. als 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 Wertes 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 Wertes 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()')
ms177483.note(de-de,SQL.90).gifHinweis:
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 Wertes durch die XML-Schemaauflistung bereitgestellt, die der abgefragten Spalte oder Variablen zugeordnet ist. Für nicht typisierte XML-Daten ist der Typ des typisierten Wertes xdt:untypedAtomic.

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

In der folgenden XML-Schemaauflistung ist das <root>-Element des ganzzahligen Datentyps 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 der LaborHours -Attribute aus allen <Location>-Elementen für ein Produktmodell ab. Entsprechend dem XML-Schema, das der Instruction-Spalte zugeordnet ist, weist LaborHours den xs:decimal-Typ auf.

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.

ms177483.note(de-de,SQL.90).gifHinweis:
Die explizite Verwendung der data()-Funktion in diesem Beispiel dient lediglich der Veranschaulichung. Wenn sie nicht angegeben wird, wendet sum() implizit die data() an, um die typisierten Werte der Knoten zu extrahieren.

Zuordnen des Sequenztyps

Ein XQuery-Ausdruck ist immer eine Sequenz aus null oder mehreren Items. Ein Item kann entweder ein atomarer Wert oder ein Knoten sein. Der Sequenztyp bezieht sich auf die Möglichkeit, den von einem Abfrageausdruck zurückgegebenen Sequenztyp einem bestimmten Typ zuzuordnen. Beispiel:

  • Wenn der Ausdruckswert atomar ist, wollen Sie vielleicht wissen, ob er vom Typ einer ganzen Zahl (integer), einem Dezimalwert (decimal) oder einer Zeichenfolge (string) entspricht.
  • Wenn der Ausdruckswert ein XML-Knoten ist, wollen Sie vielleicht wissen, ob es sich um einen Kommentarknoten, einen Verarbeitungsanweisungsknoten oder einen Textknoten handelt.
  • Sie wollen vielleicht wissen, ob der Ausdruck ein XML-Element oder einen Attributknoten eines bestimmten Namens oder Typs zurückgibt.

Zur Sequenztypzuordnung können Sie den booleschen instance of-Operator verwenden. Weitere Informationen zum instance of-Ausdruck finden Sie unter SequenceType-Ausdrücke (XQuery).

Vergleichen des Typs des von einem Ausdruck zurückgegebenen atomaren Wertes

Wenn ein Ausdruck eine Sequenz aus atomaren Werten zurückgibt, müssen Sie eventuell herausfinden, welchen Typ der Wert in der Sequenz aufweist. Die folgenden Beispiele zeigen, wie die Sequenztypsyntax verwendet werden kann, um den Typ des von einem Ausdruck zurückgegebenen atomaren Wertes auszuwerten.

Beispiel A

Der empty()-Sequenztyp kann in einem Sequenztypausdruck verwendet werden, um zu ermitteln, ob es sich bei der vom angegebenen Ausdruck zurückgegebenen Sequenz um eine leere Sequenz handelt.

Im folgenden Beispiel ermöglicht das XML-Schema, dass das <root>-Element auf null gesetzt wird.

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

Wenn jetzt eine typisierte XML-Instanz einen Wert für das <root>-Element angibt, gibt instance of empty() den Wert False zurück.

DECLARE @var XML(SC1)
SET @var = '<root>1</root>'
-- The following returns False
SELECT @var.query('data(/root[1]) instance of  empty() ')
GO

Wenn das <root>-Element in der Instanz auf null gesetzt ist, ist ihr Wert eine leere Sequenz, und instance of empty() gibt den Wert True zurück.

DECLARE @var XML(SC)
SET @var = '<root xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />'
SELECT @var.query('data(/root[1]) instance of  empty() ')
GO

Beispiel B

Manchmal ist es notwendig, den von einem Ausdruck zurückgegebenen Sequenztyp vor der weiteren Verarbeitung auszuwerten. Sie können z. B. ein XML-Schema haben, in dem ein Knoten als ein union-Typ definiert ist. Im folgenden Beispiel definiert das XML-Schema in der Auflistung das Attribut a als einen Vereinigungstyp, dessen Wert den Datentyp decimal oder string besitzen kann.

-- Drop schema collection if it exists.
-- DROP XML SCHEMA COLLECTION SC.
-- GO
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema">
  <element name="root">
    <complexType>
       <sequence/>
         <attribute name="a">
            <simpleType>
               <union memberTypes="decimal string"/>
            </simpleType>
         </attribute>
     </complexType>
  </element>
</schema>'
GO

Vor dem Verarbeiten einer typisierten XML-Instanz möchten Sie u. U. wissen, welchen Datentyp der Wert des Attributs a aufweist. Im folgenden Beispiel weist der Wert des Attributs a einen decimal-Datentyp auf. Deshalb gibt , instance of xs:decimal den Wert True zurück.

DECLARE @var XML(SC)
SET @var = '<root a="2.5"/>'
SELECT @var.query('data((/root/@a)[1]) instance of xs:decimal')
GO

Ändern Sie jetzt den Wert des Attributs a in einen Zeichenfolgentyp (string). instance of xs:string gibt den Wert True zurück.

DECLARE @var XML(SC)
SET @var = '<root a="Hello"/>'
SELECT @var.query('data((/root/@a)[1]) instance of xs:string')
GO

Beispiel C

Dieses Beispiel veranschaulicht die Auswirkung einer Kardinalität in einem Sequenzausdruck. Das folgende XML-Schema definiert ein <root>-Element, das den byte-Datentyp hat und auf null gesetzt werden kann.

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

In der folgenden Abfrage gibt instance of den Wert True zurück, weil der Ausdruck ein Singleton des byte-Datentyps zurückgibt.

DECLARE @var XML(SC)
SET @var = '<root>111</root>'
SELECT @var.query('data(/root[1]) instance of  xs:byte ') 
GO

Wenn Sie das <root>-Element auf null setzen, ist dessen Wert eine leere Sequenz. Das heißt, der Ausdruck (/root[1]) gibt eine leere Sequenz zurück. Deshalb gibt instance of xs:byte den Wert False zurück. Beachten Sie, dass die Standardkardinalität in diesem Fall 1 ist.

DECLARE @var XML(SC)
SET @var = '<root xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></root>'
SELECT @var.query('data(/root[1]) instance of  xs:byte ') 
GO
-- result = false

Wenn Sie die Kardinalität angeben, indem Sie den Auftrittsindikator (?) hinzufügen, gibt der Sequenzausdruck den Wert True zurück.

DECLARE @var XML(SC)
SET @var = '<root xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></root>'
SELECT @var.query('data(/root[1]) instance of  xs:byte? ') 
GO
-- result = true

Beachten Sie, dass das Testen in einem Sequenztypausdruck in zwei Stufen erfolgt:

  1. Zunächst wird beim Testen ermittelt, ob der Ausdruckstyp mit dem angegebenen Typ übereinstimmt.
  2. Wenn das der Fall ist, wird anschließend ermittelt, ob die Anzahl der vom Ausdruck zurückgegebenen Items mit dem angegebenen Auftrittsindikator übereinstimmt.

Wenn beide Bedingungen erfüllt sind, gibt der instance of-Ausdruck den Wert True zurück.

Beispiel D

Im folgenden Beispiel wird eine Abfrage für eine Instructions-Spalte des xml-Typs in der AdventureWorks-Datenbank angegeben. Dies ist eine typisierte XML-Spalte, da ihr ein Schema zugeordnet ist. Weitere Informationen finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks-Datenbank. Das XML-Schema definiert das LocationID-Attribut des ganzzahligen Datentyps (integer). Deshalb gibt instance of xs:integer? im Sequenzausdruck den Wert True zurück.

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

Vergleichen des Typs des von einem Ausdruck zurückgegebenen Knoten

Wenn ein Ausdruck eine Sequenz aus Knoten zurückgibt, müssen Sie eventuell herausfinden, welchen Typ der Knoten in der Sequenz aufweist. Die folgenden Beispiele zeigen, wie die Sequenztypsyntax verwendet werden kann, um den Typ des von einem Ausdruck zurückgegebenen Knotens auszuwerten. Sie können die folgenden Sequenztypen verwenden:

  • item() – Entspricht jedem Item in der Sequenz.
  • node() – Bestimmt, ob die Sequenz ein Knoten ist.
  • processing-instruction() – Bestimmt, ob der Ausdruck eine Verarbeitungsanweisung zurückgibt.
  • comment() – Bestimmt, ob der Ausdruck einen Kommentar zurückgibt.
  • document-node() – Bestimmt, ob der Ausdruck einen Dokumentknoten zurückgibt.

Die folgenden Beispiele veranschaulichen diese Sequenztypen.

Beispiel A

In diesem Beispiel werden mehrere Abfragen für eine nicht typisierte XML-Variable ausgeführt. Diese Abfragen veranschaulichen die Verwendung der Sequenztypen.

DECLARE @var XML
SET @var = '<?xml-stylesheet href="someValue" type="text/xsl" ?>
<root>text node
  <!-- comment 1 --> 
  <a>Data a</a>
  <!-- comment  2 -->
</root>'

In der ersten Abfrage gibt der Ausdruck den typisierten Wert von Element <a> zurück. In der zweiten Abfrage gibt der Ausdruck das Element <a> zurück. Beides sind Items. Deshalb geben beide Abfragen den Wert True zurück.

SELECT @var.query('data(/root[1]/a[1]) instance of item()')
SELECT @var.query('/root[1]/a[1] instance of item()')

Alle XQuery-Ausdrücke in den folgenden drei Abfragen geben den untergeordneten Elementknoten des <root>-Elements zurück. Deshalb gibt der Sequenztypausdruck (instance of node()) den Wert True zurück, und die anderen beiden Ausdrücke (instance of text() und instance of document-node()) geben den Wert False zurück.

SELECT @var.query('(/root/*)[1] instance of node()')
SELECT @var.query('(/root/*)[1] instance of text()')
SELECT @var.query('(/root/*)[1] instance of document-node()') 

In der folgenden Abfrage gibt der instance of document-node()-Ausdruck den Wert True zurück, weil das übergeordnete Element des <root>-Elements ein Dokumentknoten ist.

SELECT @var.query('(/root/..)[1] instance of document-node()') -- true

In der folgenden Abfrage ruft der Ausdruck den ersten Knoten aus der XML-Instanz ab. Da es sich dabei um einen Verarbeitungsanweisungsknoten handelt, gibt der instance of processing-instruction()-Ausdruck den Wert True zurück.

SELECT @var.query('(/node())[1] instance of processing-instruction()')

Implementierungseinschränkungen

Es gelten die folgenden speziellen Einschränkungen:

  • document-node() mit Inhaltstypsyntax wird nicht unterstützt.
  • processing-instruction(name)-Syntax wird nicht unterstützt.

Elementtest

Ein Elementtest wird verwendet, um den von einem Ausdruck zurückgegebenen Elementknoten einem Elementknoten mit einem bestimmten Namen und Typ zuzuordnen. Sie können die folgenden Elementtests verwenden:

element ()
element(ElementName)
element(ElementName, ElementType?) 
element(*, ElementType?)

Attributtest

Der Attributtest ermittelt, ob es sich bei dem von einem Ausdruck zurückgegebenen Ausdruck um einen Attributknoten handelt. Sie können die folgenden Attributtests verwenden:

attribute()

attribute(AttributeName)

attribute(AttributeName, AttributeType)

Testbeispiele

Die folgenden Beispiele veranschaulichen Szenarios, in denen Element- und Attributtests hilfreich sind.

Beispiel A

Das folgende XML-Schema definiert den komplexen CustomerType-Typ, wobei die Elemente <firstName> und <lastName> optional sind. Für eine angegebene XML-Instanz müssen Sie eventuell ermitteln, ob der Vorname für einen bestimmten Kunden vorhanden ist.

CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="myNS" xmlns:ns="myNS">
  <complexType name="CustomerType">
     <sequence>
        <element name="firstName" type="string" minOccurs="0" 
                  nillable="true" />
        <element name="lastName" type="string" minOccurs="0"/>
     </sequence>
  </complexType>
  <element name="customer" type="ns:CustomerType"/>
</schema>
'
GO
DECLARE @var XML(SC)
SET @var = '<x:customer xmlns:x="myNS">
<firstName>SomeFirstName</firstName>
<lastName>SomeLastName</lastName>
</x:customer>'

Die folgende Abfrage verwendet einen instance of element (firstName)-Ausdruck, um zu ermitteln, ob das erste untergeordnete Element von <customer> ein Element ist, dessen Name <firstName> ist. In diesem Fall gibt die Abfrage den Wert True zurück.

SELECT @var.query('declare namespace x="myNS"; 
     (/x:customer/*)[1] instance of element (firstName)')
GO

Wenn Sie das <firstName>-Element aus der Instanz entfernen, gibt die Abfrage den Wert False zurück.

Sie können auch Folgendes verwenden:

  • Die element(ElementName, ElementType?)-Sequenztypsyntax, die in der folgenden Abfrage dargestellt ist. Sie ordnet einen auf null gesetzten oder einen nicht auf null gesetzten Elementknoten zu, dessen Name firstName ist und dessen Typ xs:string ist.

    SELECT @var.query('declare namespace x="myNS"; 
    (/x:customer/*)[1] instance of element (firstName, xs:string?)')
    
  • Die element(*, type?)-Sequenztypsyntax, die in der folgenden Abfrage dargestellt ist. Sie ordnet den Elementknoten zu, wenn dessen Typ unabhängig von seinem Namen xs:string ist.

    SELECT @var.query('declare namespace x="myNS"; (/x:customer/*)[1] instance of element (*, xs:string?)')
    GO
    

Beispiel B

Das folgende Beispiel zeigt, wie ermittelt wird, ob der von einem Ausdruck zurückgegebene Knoten ein Elementknoten mit einem bestimmten Namen ist. Es verwendet den element()-Test.

Im folgenden Beispiel weisen die beiden abgefragten <Customer>-Elemente in der XML-Instanz zwei unterschiedliche Typen auf: CustomerType und SpecialCustomerType. Angenommen, Sie wollen den Typ des vom Ausdruck zurückgegebenen <Customer>-Element ermitteln. Die folgende XML-Schemaauflistung definiert die Typen CustomerType und SpecialCustomerType.

CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema"
          targetNamespace="myNS"  xmlns:ns="myNS">
  <complexType name="CustomerType">
    <sequence>
      <element name="firstName" type="string"/>
      <element name="lastName" type="string"/>
    </sequence>
  </complexType>
  <complexType name="SpecialCustomerType">
     <complexContent>
       <extension base="ns:CustomerType">
        <sequence>
            <element name="Age" type="int"/>
        </sequence>
       </extension>
     </complexContent>
    </complexType>
   <element name="customer" type="ns:CustomerType"/>
</schema>
'
GO

Diese XML-Schemaauflistung wird verwendet, um eine typisierte xml-Variable zu erstellen. Die dieser Variablen zugeordnete XML-Instanz besitzt zwei <customer>-Elemente mit unterschiedlichen Typen. Das erste Element weist den CustomerType-Typ auf und das zweite Element den SpecialCustomerType-Typ.

DECLARE @var XML(SC)
SET @var = '
<x:customer xmlns:x="myNS">
   <firstName>FirstName1</firstName>
   <lastName>LastName1</lastName>
</x:customer>
<x:customer xsi:type="x:SpecialCustomerType" xmlns:x="myNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <firstName> FirstName2</firstName>
   <lastName> LastName2</lastName>
   <Age>21</Age>
</x:customer>'

In der folgenden Abfrage gibt der instance of element (*, x:SpecialCustomerType ?)-Ausdruck den Wert False zurück, weil der Ausdruck das erste Kundenelement zurückgibt, das nicht den SpecialCustomerType-Typ aufweist.

SELECT @var.query('declare namespace x="myNS"; 
    (/x:customer)[1] instance of element (*, x:SpecialCustomerType ?)')

Wenn Sie den Ausdruck der vorherigen Abfrage ändern und das zweite <customer>-Element (/x:customer)[2]) abrufen, gibt der instance of-Ausdruck den Wert True zurück.

Beispiel C

Dieses Beispiel verwendet den Attributtest. Das folgende XML-Schema definiert den komplexen CustomerType-Typ mit den Attributen CustomerID und Age. Das Age-Attribut ist optional. Für eine bestimmte XML-Instanz wollen Sie eventuell ermitteln, ob das Age-Attribut im <customer>-Element vorhanden ist.

CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema"
       targetNamespace="myNS" xmlns:ns="myNS">
<complexType name="CustomerType">
  <sequence>
     <element name="firstName" type="string" minOccurs="0" 
               nillable="true" />
     <element name="lastName" type="string" minOccurs="0"/>
  </sequence>
  <attribute name="CustomerID" type="integer" use="required" />
  <attribute name="Age" type="integer" use="optional" />
 </complexType>
 <element name="customer" type="ns:CustomerType"/>
</schema>
'
GO

Die folgende Abfrage gibt den Wert True zurück, weil es in der abgefragten XML-Instanz einen Attributknoten mit dem Namen Age gibt. In diesem Ausdruck wird der attribute(Age)-Attributtest verwendet. Da Attribute keine Reihenfolge haben, verwendet die Abfrage den FLWOR-Ausdruck, um alle Attribute abzurufen, und testet dann jedes Attribut mit dem instance of-Ausdruck. Das Beispiel erstellt zuerst eine XML-Schemaauflistung, um eine typisierte xml-Variable zu erstellen.

DECLARE @var XML(SC)
SET @var = '<x:customer xmlns:x="myNS" CustomerID="1" Age="22" >
<firstName>SomeFName</firstName>
<lastName>SomeLName</lastName>
</x:customer>'
SELECT @var.query('declare namespace x="myNS"; 
FOR $i in /x:customer/@*
RETURN
    IF ($i instance of attribute (Age)) THEN
        "true"
        ELSE
        ()')   
GO

Wenn Sie das optionale Age-Attribut aus der Instanz entfernen, gibt die vorherige Abfrage den Wert False zurück.

Sie können im Attributtest den Attributnamen und den Attributtyp (attribute(name,type)) angeben.

SELECT @var.query('declare namespace x="myNS"; 
FOR $i in /x:customer/@*
RETURN
    IF ($i instance of attribute (Age, xs:integer)) THEN
        "true"
        ELSE
        ()')

Alternativ können Sie die attribute(*, type)-Sequenztypsyntax angeben. Dies ordnet den Attributknoten zu, wenn der Typ des Attributs unabhängig von dessen Namen mit dem angegebenen Typ übereinstimmt.

Implementierungseinschränkungen

Es gelten die folgenden speziellen Einschränkungen:

  • Im Elementtest muss dem Typnamen der Auftrittsindikator (?) folgen.
  • element(ElementName, TypeName) wird nicht unterstützt.
  • element(*, TypeName) wird nicht unterstützt.
  • schema-element() wird nicht unterstützt.
  • schema-attribute(AttributeName) wird nicht unterstützt.
  • Explizites Abfragen von xsi:type oder xsi:nil wird nicht unterstützt.

Siehe auch

Konzepte

SequenceType-Ausdrücke (XQuery)
XQuery-Grundlagen

Andere Ressourcen

Verwenden von SQL Server Profiler

Hilfe und Informationen

Informationsquellen für SQL Server 2005