Condividi tramite


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 XML Schema

I tipi predefiniti di XML Schema 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 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 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 dalla raccolta di XML Schema associata alla colonna.

Tipi definiti nello spazio dei nomi dei tipi di dati XPath

Ai tipi definiti nello spazio dei nomi http://www.w3.org/2004/07/xpath-datatypes è associato 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 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 evalore 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 tipizzati, il tipo del valore tipizzato è xdt:untypedAtomic.

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

Nella raccolta di XML Schema 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 all'XML Schema 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.

Vedere anche

Altre risorse

Modelli e autorizzazioni di SQL Server Profiler

Nozioni fondamentali su XQuery