Freigeben über


Data Accessor-Funktionen – data (XQuery)

Gilt für: SQL Server

Gibt den typierten Wert für jedes Element zurück, das durch $arg angegeben wird.

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 untypiert ist, entspricht der typisierte Wert dem Zeichenfolgenwert, der als Instanz von xdt:untypedAtomic zurückgegeben wird.

  • Wenn der Elementknoten nicht eingegeben wurde, entspricht der typisierte Wert dem Zeichenfolgenwert, der als Instanz von "xdt:untypedAtomic" zurückgegeben wird.

Für typisierte Elementknoten gilt Folgendes:

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

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

Obwohl die Verwendung der Data() -Funktion häufig optional ist, wie in den folgenden Beispielen gezeigt, erhöht die Angabe der Data() -Funktion die Abfragelesbarkeit explizit. Weitere Informationen finden Sie unter XQuery Basics.

Daten() für konstruierte XML können nicht angegeben werden, wie in den folgenden Beispielen dargestellt:

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 XML-Typspalten in der AdventureWorks-Datenbank gespeichert sind.

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 Attributs, eines Elements und eines 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 erstellen. 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 Instanzen, 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" eingegeben wurden, da <Material> sie nicht eingegeben wurden. Wenn die Eingabe nicht eingegeben wird, wird das Ergebnis von "data()" als "xdt:untypedAtomic" eingegeben.

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>Aluminum Alloy</Material>Aluminum Alloy  
</Root>  

In der folgenden Abfrage gibt data($pd/p1:Features/wm:Warranty) einen statischen Fehler zurück, da es sich um <Warranty> ein komplexes Typelement handelt.

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  

Weitere Informationen

XQuery Functions against the xml Data Type (XQuery-Funktionen für den xml-Datentyp)