Sequenza e QName (XQuery)

Si applica a:SQL Server

In questo argomento vengono descritti i concetti fondamentali di XQuery seguenti:

  • Sequenza

  • QName e spazi dei nomi predefiniti

Sequenza

In XQuery, il risultato di un'espressione è composto da un elenco di nodi XML e da istanze di tipi atomici XSD. Una singola voce di una sequenza viene definita come un elemento, che può essere:

  • Un nodo, ad esempio un nodo elemento, attributo, di testo, di istruzione di elaborazione, di commento o di documento.

  • Un valore atomico, ad esempio un'istanza di un tipo XSD semplice.

Ad esempio, la query seguente crea una sequenza di due nodi elemento:

SELECT Instructions.query('  
     <step1> Step 1 description goes here</step1>,  
     <step2> Step 2 description goes here </step2>  
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7;  
  

Risultato:

<step1> Step 1 description goes here </step1>  
<step2> Step 2 description goes here </step2>   

Nella query precedente, la virgola (,) alla fine della sintassi <step1> è il costruttore della sequenza ed è obbligatorio. Gli spazi vuoti nei risultati vengono aggiunti solo a scopo illustrativo e sono inseriti in tutti i risultati degli esempi di questa documentazione.

Di seguito sono riportate informazioni aggiuntive sulle sequenze che è consigliabile conoscere:

  • Se una query restituisce una sequenza che contiene un'altra sequenza, quest'ultima viene convertita in formato flat nel contenitore Sequenza. Ad esempio, la sequenza ((1,2, (3,4,5)),6) viene convertita in formato flat nel modello di dati come (1, 2, 3, 4, 5, 6).

    DECLARE @x xml;  
    SET @x = '';  
    SELECT @x.query('(1,2, (3,4,5)),6');  
    
  • Una sequenza vuota non contiene alcun elemento ed è rappresentata come "()".

  • Una sequenza con un solo elemento può essere considerata come un valore atomico e viceversa, ovvero (1) = 1.

In questa implementazione, la sequenza deve essere omogenea, ovvero deve essere una sequenza di valori atomici o di nodi. Ad esempio, le sequenze seguenti sono valide:

DECLARE @x xml;  
SET @x = '';  
-- Expression returns a sequence of 1 text node (singleton).  
SELECT @x.query('1');  
-- Expression returns a sequence of 2 text nodes  
SELECT @x.query('"abc", "xyz"');  
-- Expression returns a sequence of one atomic value. data() returns  
-- typed value of the node.  
SELECT @x.query('data(1)');  
-- Expression returns a sequence of one element node.   
-- In the expression XML construction is used to construct an element.  
SELECT @x.query('<x> {1+2} </x>');  

La query seguente restituisce un errore perché le sequenze eterogenee non sono supportate.

SELECT @x.query('<x>11</x>, 22');  

QName

Ogni identificatore di una query XQuery è un QName, che è composto da un prefisso dello spazio dei nomi e da un nome locale. In questa implementazione, i nomi delle variabili in XQuery sono rappresentati da QName e non possono avere un prefisso.

Si consideri l'esempio seguente in cui viene specificata una query su una variabile xml non tipizzata:

DECLARE @x xml;  
SET @x = '<Root><a>111</a></Root>';  
SELECT @x.query('/Root/a');  

Nell'espressione (/Root/a), Root e a sono QName.

Nell'esempio seguente viene specificata una query su una colonna xml tipizzata. La query esegue l'iterazione su tutti gli <elementi di passaggio> nella prima posizione del centro di lavoro.

SELECT Instructions.query('  
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
for $Step in /AWMI:root/AWMI:Location[1]/AWMI:step  
      return  
           string($Step)   
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7;  

Nell'espressione della query, si noti quanto segue:

  • AWMI root, AWMI:Location, AWMI:stepe $Step sono QName. AWMI è un prefisso e root, Location e Step sono nomi locali.

  • La variabile $step è un QName e non ha un prefisso.

Gli spazi dei nomi seguenti sono predefiniti per l'uso con il supporto di XQuery in SQL Server.

Prefisso URI
xs http://www.w3.org/2001/XMLSchema
xsi http://www.w3.org/2001/XMLSchema-instance
xdt http://www.w3.org/2004/07/xpath-datatypes
fn http://www.w3.org/2004/07/xpath-functions
(nessun prefisso) urn:schemas-microsoft-com:xml-sql
sqltypes https://schemas.microsoft.com/sqlserver/2004/sqltypes
xml http://www.w3.org/XML/1998/namespace
(nessun prefisso) https://schemas.microsoft.com/sqlserver/2004/SOAP

Ogni database creato include la raccolta sys XML Schema. Questi schemi sono riservati e pertanto è possibile accedervi da qualsiasi altra raccolta di XML Schema creata dall'utente.

Nota

Questa implementazione non supporta il local prefisso come descritto nella specifica XQuery in http://www.w3.org/2004/07/xquery-local-functions.

Vedi anche

Nozioni fondamentali su XQuery