Share via


Sequenza e QName (XQuery)

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, nel quale una query viene eseguita 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, una query viene eseguita su una colonna di tipo xml. La query esegue un'iterazione su tutti gli elementi <step> nel primo centro di lavorazione.

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:step e $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 vengono utilizzati per impostazione predefinita con il supporto 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

Per ogni database creato è disponibile l'insieme di schemi XML sys. Questi schemi sono riservati e pertanto è possibile accedervi da qualsiasi altro insieme di schemi XML creato dall'utente. Per ulteriori informazioni, vedere Raccolta di schemi XML predefinita (sys).

Nota

Questa implementazione non supporta il prefisso local come descritto nella specifica di XQuery disponibile in http://www.w3.org/2004/07/xquery-local-functions (informazioni in lingua inglese).