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:step
e$Step
sono QName.AWMI
è un prefisso eroot
,Location
eStep
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.