Funzione data (XQuery)
Restituisce il valore tipizzato di ogni elemento specificato da $arg.
Sintassi
fn:data ($arg as item()*) as xdt:untypedAtomic*
Argomenti
- $arg
Sequenza di elementi per i quali verranno restituiti i valori tipizzati.
Osservazioni
Per i valori tipizzati sono valide le osservazioni seguenti:
Il valore tipizzato di un valore atomico è il valore atomico.
Il valore tipizzato di un nodo di testo è il valore stringa del nodo di testo.
Il valore tipizzato di un commento è il valore stringa del commento.
Il valore tipizzato di un'istruzione di elaborazione è il contenuto dell'istruzione, senza il relativo nome di destinazione.
Il valore tipizzato di un nodo documento è il relativo valore stringa.
Per i nodi attributo ed elemento sono valide le osservazioni seguenti:
Se un nodo attributo è tipizzato con un tipo di XML Schema, il relativo valore tipizzato è il valore tipizzato corrispondente.
Se il nodo attributo non è tipizzato, il relativo valore tipizzato è uguale al valore stringa restituito come un'istanza di xdt:untypedAtomic.
Se il nodo elemento non è tipizzato, il relativo valore tipizzato è uguale al valore stringa restituito come un'istanza di xdt:untypedAtomic.
Per i nodi elemento tipizzati sono valide le osservazioni seguenti:
Se l'elemento ha un tipo di contenuto semplice, data() restituisce il valore tipizzato dell'elemento.
Se il nodo è di tipo complesso e include xs:anyType, data() restituisce un errore statico.
Benché l'utilizzo della funzione data() sia in genere facoltativo, come illustrato negli esempi seguenti, la specifica di questa funzioneconsente di migliorare in modo esplicito la leggibilità della query. Per ulteriori informazioni, vedere Nozioni fondamentali su XQuery.
Non è possibile specificare data() nel codice XML creato, come illustrato nell'esempio seguente:
declare @x xml;
set @x = '';
select @x.query('data(<SomeNode>value</SomeNode>)');
Esempi
In questo argomento vengono forniti esempi di utilizzo del linguaggio XQuery sulle istanze XML archiviate in diverse colonne di tipo xml nel database AdventureWorks2008R2. Per una panoramica su ognuna di queste colonne, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks2008R2.
A. Utilizzo della funzione XQuery data() per estrarre il valore tipizzato di un nodo
Nella query seguente viene illustrato l'utilizzo della funzione data() per recuperare i valori di un attributo, di un elemento e di un nodo di testo:
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
Risultato:
<Root ProductID="19" Feature="parts and labor"/>
Come descritto in precedenza, l'utilizzo della funzione data() è facoltativo durante la creazione di attributi. Se la funzionenon viene specificata, verrà presunta in modo implicito. La query seguente genera gli stessi risultati della query precedente:
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;
Negli esempi seguenti vengono illustrate istanze nelle quali è richiesta la funzione data().
Nella query seguente, $pd/p1:Specifications/Material restituisce l'elemento <Material>. Inoltre, data($pd/p1:Specifications/ Material) restituisce dati di tipo carattere tipizzati come xdt:untypedAtomic, perché <Material> non è tipizzato. Se l'input non è tipizzato, il risultato di data() viene tipizzato come xdt:untypedAtomic.
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;
Risultato:
<Radice>
<Material>Almuminum Alloy</Material>Almuminum Alloy
</Root>
Nella query seguente, data($pd/p1:Features/wm:Warranty) restituisce un errore statico perché <Warranty> è un elemento di tipo complesso.
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;