Condividi tramite


Funzioni di accesso ai dati - Dati (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 i cui valori tipizzati vengono restituiti.

Osservazioni:

Le considerazioni seguenti si applicano ai valori tipizzati:

  • 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.

Le considerazioni seguenti si applicano ai nodi attributo ed elemento:

  • 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 relativo valore tipizzato è uguale al valore stringa restituito come istanza di xdt:untypedAtomic.

  • Se il nodo dell'elemento non è stato tipizzato, il relativo valore tipizzato è uguale al valore stringa restituito come istanza di xdt:untypedAtomic.

Le considerazioni seguenti si applicano ai nodi di elemento tipizzato:

  • 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 data() funzione è spesso facoltativo, come illustrato negli esempi seguenti, specificando la funzione aumenta in modo esplicito la data() leggibilità delle query. Per altre informazioni, vedere Nozioni di base su XQuery.

Non è possibile specificare data() in xml costruito, come illustrato nell'esempio seguente:

DECLARE @x AS XML;

SET @x = '';

SELECT @x.query('data(<SomeNode>value</SomeNode>)');

Esempi

Questo articolo fornisce esempi di XQuery su istanze XML archiviate in varie colonne di tipo xml nel database AdventureWorks.

R. Usare la funzione XQuery data() per estrarre il valore tipizzato di un nodo

La query seguente illustra come viene usata la data() funzione 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;

Il risultato è il seguente:

<Root ProductID="19" Feature="parts and labor"/>

Come accennato, la data() funzione è facoltativa quando si creano attributi. Se non si specifica la data() funzione, si presuppone 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 data() funzione .

Nella query seguente restituisce $pd/p1:Specifications/Material l'elementoMaterial<> . Restituisce data($pd/p1:Specifications/ Material) anche dati di tipo carattere digitati come xdt:untypedAtomic, perché <Material> non è tipizzato. Quando l'input non è tipizzato, il risultato di data() viene digitato 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;

Il risultato è il seguente:

<Root>
  <Material>Aluminum Alloy</Material>Aluminum Alloy
</Root>

Nella query seguente restituisce data($pd/p1:Features/wm:Warranty) 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;