Sistema di tipi (XQuery)

Si applica a: sìSQL Server (tutte le versioni supportate)

XQuery è un linguaggio fortemente tipizzato per i tipi di schema e tipizzato in modo debole per i dati non tipizzati. I tipi predefiniti di XQuery sono:

Questo argomento descrive inoltre quanto segue:

  • Valore tipizzato e valore stringa di un nodo.

  • La funzione data (XQuery) e la stringa Function (XQuery).

  • Individuazione di una corrispondenza per il tipo di sequenza restituito da un'espressione.

Tipi predefiniti di XML Schema

I tipi predefiniti di XML Schema hanno un prefisso predefinito xs Alcuni di questi tipi includono xs:integer e xs:string. Tutti questi tipi predefiniti sono supportati ed è possibile utilizzarli per la creazione di una raccolta di XML Schema.

Quando si esegue una query su codice XML tipizzato, il tipo statico e dinamico dei nodi è determinato dalla raccolta di XML Schema associata alla colonna o alla variabile su cui viene eseguita la query. Per altre informazioni sui tipi statici e dinamici, vedere Contesto dell'espressione e valutazione delle query (XQuery). Ad esempio, la query seguente viene specificata su una colonna xml tipiata ( Instructions ). Nell'espressione viene utilizzato l'elemento instance of per verificare che il valore tipizzato dell'attributo LotSize restituito sia di tipo xs:decimal.

SELECT Instructions.query('  
   DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
   data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal  
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Queste informazioni relative alla tipizzazione vengono fornite dalla raccolta di XML Schema associata alla colonna.

Tipi definiti nello spazio dei nomi dei tipi di dati XPath

I tipi definiti nello spazio http://www.w3.org/2004/07/xpath-datatypes dei nomi hanno un prefisso predefinito xdt. Per questi tipi sono valide le osservazioni seguenti:

  • Non è possibile utilizzarli per la creazione di una raccolta di XML Schema. Questi tipi vengono usati nel sistema di tipi XQuery e per XQuery e tipizzazione statica. È possibile eseguire il cast ai tipi atomici, ad esempio xdt:untypedAtomic, nello spazio dei nomi xdt.

  • Quando si esegue una query su XML non tipiato, il tipo statico e dinamico dei nodi elemento è xdt:untyped e il tipo di valori di attributo è xdt:untypedAtomic. Il risultato di un metodo query() genera codice XML non tipiato. Ciò significa che i nodi XML vengono restituiti rispettivamente come xdt:untyped e xdt:untypedAtomic.

  • I tipi xdt:dayTimeDuration e xdt:yearMonthDuration non sono supportati.

Nell'esempio seguente, la query viene eseguita su una variabile XML non tipizzata. L'espressione data(/a[1]) restituisce una sequenza di un singolo valore atomico. La funzione data() restituisce il valore tipizzato dell'elemento <a>. Il codice XML su cui viene eseguita la query è non tipizzato e pertanto il tipo del valore restituito è xdt:untypedAtomic. Di conseguenza, instance of restituisce true.

DECLARE @x xml  
SET @x='<a>20</a>'  
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )  

Anziché recuperare il valore tipizzato, l'espressione (/a[1]) dell'esempio seguente restituisce una sequenza di un singolo elemento, ovvero l'elemento <a>. Questo elemento viene utilizzato dall'espressione instance of per verificare che il valore restituito dall'espressione sia un nodo elemento di tipo xdt:untyped type.

DECLARE @x xml  
SET @x='<a>20</a>'  
-- Is this an element node whose name is "a" and type is xdt:untyped.  
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')  
-- Is this an element node of type xdt:untyped.  
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')  
-- Is this an element node?  
SELECT @x.query( '/a[1] instance of element()')  

Nota

Quando si esegue una query su un'istanza XML tipizzata e l'espressione della query include l'asse padre, le informazioni relative al tipo statico dei nodi risultanti non sono più disponibili. Il tipo dinamico rimane tuttavia associato ai nodi.

Valore tipizzato e valore stringa

A ogni nodo è associato un valore tipizzato e un valore stringa. Per i dati XML tipizzati, il tipo del valore tipizzato è fornito dalla raccolta di XML Schema associata alla colonna o alla variabile su cui viene eseguita la query. Per i dati XML non tipiati, il tipo del valore tipiato è xdt:untypedAtomic.

È possibile usare la funzione data() o string() per recuperare il valore di un nodo:

Nella raccolta di XML Schema seguente viene definito <root>'elemento di tipo Integer:

CREATE XML SCHEMA COLLECTION SC AS N'  
<schema xmlns="http://www.w3.org/2001/XMLSchema">  
      <element name="root" type="integer"/>  
</schema>'  
GO  

Nell'esempio seguente, l'espressione recupera innanzitutto il valore tipizzato di /root[1] e quindi vi aggiunge 3.

DECLARE @x xml(SC)  
SET @x='<root>5</root>'  
SELECT @x.query('data(/root[1]) + 3')  

Nell'esempio seguente, l'espressione ha esito negativo perché string(/root[1]) restituisce un valore di tipo string. Questo valore viene quindi passato a un operatore aritmetico che utilizza solo valori di tipo numeric come operandi.

-- Fails because the argument is string type (must be numeric primitive type).  
DECLARE @x xml(SC)  
SET @x='<root>5</root>'  
SELECT @x.query('string(/root[1]) + 3')  

Nell'esempio seguente viene calcolato il totale degli attributi LaborHours. La funzione recupera i valori tipici degli attributi da tutti gli elementi <data()> per un modello di LaborHours Location prodotto. In base all'XML Schema associato alla Instruction colonna, LaborHours è di tipo xs:decimal.

SELECT Instructions.query('   
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";   
             sum(data(//AWMI:Location/@LaborHours))   
') AS Result   
FROM Production.ProductModel   
WHERE ProductModelID=7  

Il risultato restituito dalla query è 12.75.

Nota

L'uso esplicito della funzione data() in questo esempio è solo a scopo illustrativo. Se non viene specificato, sum() applica in modo implicito la funzione data() per estrarre i valori tipici dei nodi.

Vedere anche

Modelli e autorizzazioni di SQL Server Profiler
Nozioni fondamentali su XQuery