Condividi tramite


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  

Vedi anche

Funzioni XQuery per il tipo di dati XML