Freigeben über


data-Funktion (XQuery)

Gibt den typisierten Wert für jedes durch $arg angegebene Item zurück.

Syntax

fn:data ($arg as item()*) as xdt:untypedAtomic*

Argumente

  • $arg
    Sequenz der Items, deren typisierte Werte zurückgegeben werden.

Hinweise

Für typisierte Werte gilt Folgendes:

  • Der typisierte Wert eines atomaren Werts ist der atomare Wert.

  • Der typisierte Wert eines Textknotens ist der Zeichenfolgenwert des Textknotens.

  • Der typisierte Wert eines Kommentars ist der Zeichenfolgenwert des Kommentars.

  • Der typisierte Wert einer Verarbeitungsanweisung ist der Inhalt der Verarbeitungsanweisung, ohne den Namen des Verarbeitungsanweisungsziels.

  • Der typisierte Wert eines Dokumentknotens ist dessen Zeichenfolgenwert.

Für Attribut- und Elementknoten gilt Folgendes:

  • Wenn ein Attributknoten mit einem XML-Schematyp typisiert wird, ist dessen typisierter Wert der entsprechende typisierte Wert.

  • Wenn der Attributknoten nicht typisiert ist, entspricht dessen typisierter Wert seinem Zeichenfolgenwert, der als eine Instanz von xdt:untypedAtomic zurückgegeben wird.

  • Wenn der Elementknoten nicht typisiert wurde, entspricht dessen typisierter Wert seinem Zeichenfolgenwert, der als eine Instanz von xdt:untypedAtomic zurückgegeben wird.

Für typisierte Elementknoten gilt Folgendes:

  • Wenn das Element einen einfachen Inhaltstyp hat, gibt data() den typisierten Wert des Elements zurück.

  • Wenn der Knoten einen komplexen Typ hat, einschließlich xs:anyType, gibt data() einen statischen Fehler zurück.

Obwohl das Verwenden der data()-Funktion häufig optional ist, wie das aus den folgenden Beispielen hervorgeht, führt das Angeben der data()-Funktion zu einer expliziten Erhöhung der Abfragelesbarkeit. Weitere Informationen finden Sie unter XQuery-Grundlagen.

Sie können data() nicht für XML-Konstrukte angeben, wie das im folgenden Beispiel gezeigt wird:

declare @x xml
set @x = ''
select @x.query('data(<SomeNode>value</SomeNode>)')

Beispiele

Dieses Thema enthält XQuery-Beispiele für XML-Instanzen, die in verschiedenen Spalten des xml-Typs in der AdventureWorks-Datenbank gespeichert sind. Eine Übersicht dieser Spalten finden Sie unter Darstellung des xml-Datentyps in der AdventureWorks-Datenbank.

A. Verwenden der XQuery-Funktion data() XQuery zum Extrahieren des typisierten Werts eines Knotens.

Die folgende Abfrage veranschaulicht, wie die data()-Funktion verwendet wird, um Werte eines Attribut-, Element- oder Textknotens abzurufen:

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)

SELECT CatalogDescription.query(N'
 for $pd in //p1:ProductDescription
 return 
    <Root 
      ProductID = "{ data( ($pd//@ProductModelID)[1] ) }" 
      Feature =   "{ data( ($pd/p1:Features/wm:Warranty/wm:Description)[1] ) }" >
    </Root>
 ') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19

Dies ist das Ergebnis:

<Root ProductID="19" Feature="parts and labor"/>

Wie bereits erwähnt, ist die data()-Funktion optional, wenn Sie Attribute konstruieren. Wenn Sie die data()-Funktion nicht angeben, wird sie implizit angenommen. Die folgende Abfrage führt zu denselben Ergebnissen wie die vorherige Abfrage:

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)

SELECT CatalogDescription.query('
      for $pd in //p1:ProductDescription
         return 
          <Root  
                ProductID = "{ ($pd/@ProductModelID)[1] }"  
                Feature =   "{ ($pd/p1:Features/wm:Warranty/wm:Description)[1] }" >
           </Root>
 ') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19

Die folgenden Beispiele veranschaulichen Fälle, in denen die data()-Funktion erforderlich ist.

In der folgenden Abfrage gibt $pd/p1:Specifications/Material das <Material>-Element zurück. Außerdem gibt data($pd/p1:Specifications/ Material) Zeichendaten zurück, die als xdt:untypedAtomic typisiert sind, weil <Material> nicht typisiert ist. Wenn die Eingabe nicht typisiert ist, wird das Ergebnis von data() als xdt:untypedAtomic typisiert.

SELECT CatalogDescription.query('
declare namespace p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
      for $pd in //p1:ProductDescription
         return 
          <Root>
             { $pd/p1:Specifications/Material }
             { data($pd/p1:Specifications/Material) }
           </Root>
 ') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19

Dies ist das Ergebnis:

<Root>
  <Material>Almuminum Alloy</Material>Almuminum Alloy
</Root>

In der folgenden Abfrage gibt data($pd/p1:Features/wm:Warranty) einen statischen Fehler zurück, weil <Warranty> ein Element mit komplexem Typ ist.

WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS p1,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)

SELECT CatalogDescription.query('
 <Root>
   {     /p1:ProductDescription/p1:Features/wm:Warranty }
   { data(/p1:ProductDescription/p1:Features/wm:Warranty) }
 </Root>
 ') as Result
FROM  Production.ProductModel
WHERE ProductModelID = 23