Share via


Sistema di tipi (XQuery)

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:

Tipi predefiniti di schema XML

I tipi predefiniti di schema XML hanno un prefisso predefinito xs e includono, ad esempio, xs:integer e xs:string. Tutti questi tipi predefiniti sono supportati ed è possibile utilizzarli per la creazione di un insieme di schemi XML.

Quando si esegue una query su codice XML tipizzato, il tipo statico e dinamico dei nodi è determinato dall'insieme di schemi XML associato alla colonna o alla variabile su cui viene eseguita la query. Per ulteriori informazioni sui tipi statici e dinamici, vedere Contesto delle espressioni e valutazione delle query (XQuery). La query seguente viene ad esempio eseguita sulla colonna di tipo xml (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 dall'insieme di schemi XML associato alla colonna. Per ulteriori informazioni, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks2008R2.

Tipi definiti nello spazio dei nomi dei tipi di dati XPath

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

  • Non è possibile utilizzarli per la creazione di un insieme di schemi XML. Questi tipi vengono utilizzati nel sistema di tipi XQuery per la 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 codice XML non tipizzato, il tipo statico e dinamico dei nodi elemento è xdt:untyped e il tipo dei valori di attributo è xdt:untypedAtomic. Il risultato di un metodo query() genera codice XML non tipizzato. 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 dall'insieme di schemi XML associato alla colonna o alla variabile su cui viene eseguita la query. Per i dati XML non tipizzati, il tipo del valore tipizzato è xdt:untypedAtomic.

Per recuperare il valore di un nodo è possibile utilizzare la funzione data() o string():

Nell'insieme di schemi XML seguente, viene definito l'elemento <root> 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 data() recupera i valori tipizzati degli attributi LaborHours da tutti gli elementi <Location> relativi a un modello di prodotto. In base allo schema XML associato alla colonna Instruction, 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

In questo esempio, la funzione data() viene utilizzata in modo esplicito a solo scopo illustrativo. Se non viene specificata, sum() applica in modo implicito la funzione data() per estrarre i valori tipizzati dei nodi.