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