Funzioni di accesso dati - data (XQuery)
Si applica a: SQL Server
Restituisce il valore tipizzato per 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 dell'attributo non è tipizzato, il valore tipizzato è uguale al valore stringa restituito come istanza di xdt:untypedAtomic.
Se il nodo dell'elemento non è stato tipizzato, il valore tipizzato è uguale al valore stringa restituito come 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, incluso xs:anyType, data() restituisce un errore statico.
Anche se l'uso della funzione data() è spesso facoltativo, come illustrato negli esempi seguenti, specificando la funzione data() aumenta in modo esplicito la leggibilità delle query. Per altre informazioni, vedere Nozioni di base su XQuery.
Non è possibile specificare data() in xml costruito, come illustrato di seguito:
declare @x xml
set @x = ''
select @x.query('data(<SomeNode>value</SomeNode>)')
Esempi
In questo argomento vengono forniti esempi di XQuery su istanze XML archiviate in varie colonne di tipo xml nel database AdventureWorks.
R. Utilizzo della funzione XQuery data() per estrarre il valore tipizzato di un nodo
La query seguente illustra come viene usata la funzione data() per recuperare i valori di un attributo, un elemento e 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 accennato, la funzione data() è facoltativa quando si creano attributi. Se non si specifica la funzione data(), viene presupposta 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
Gli esempi seguenti illustrano le istanze in cui è necessaria la funzione data().
Nella query seguente $pd/p1:Specifications/Material restituisce l'elementoMaterial
<> . Inoltre, data($pd/p1:Specifications/Material) restituisce dati di tipo carattere digitati come xdt:untypedAtomic, perché <Material
> non è tipizzato. Quando 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:
<Root>
<Material>Aluminum Alloy</Material>Aluminum 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