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)