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 Wertes 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 Wertes 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
Siehe auch
Verweis
XQuery-Funktionen für den xml-Datentyp