Teilen über


Data Accessor-Funktionen – data (XQuery)

Gilt für:SQL Server

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

Syntax

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

Argumente

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

Bemerkungen

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 sein typisierter Wert seinem Zeichenfolgenwert, der als Instanz von xdt:untypedAtomic zurückgegeben wird.

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

Für typisierte Elementknoten gilt Folgendes:

  • Wenn das Element über einen einfachen Inhaltstyp verfügt, gibt data() den typisierten 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 explizit die Lesbarkeit von Abfragen. Weitere Informationen finden Sie unter XQuery-Grundlagen.

Sie können data() nicht für eine erstellte XML-Datei angeben, wie im Folgenden gezeigt:

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

Beispiele

In diesem Thema finden Sie XQuery-Beispiele für XML-Instanzen, die in verschiedenen Spalten des XML-Typs 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 zum Abrufen von Werten eines Attributs, eines Elements und eines Textknotens verwendet wird:

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 typisiert sind, da <Material> nicht typisiert ist. Wenn die Eingabe nicht typisiert ist, 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>Almuminum Alloy</Material>Almuminum 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-Funktionen für den xml-Datentyp