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