Moduli e prologhi - Prologo XQuery
Si applica a: SQL Server
Una query XQuery è composta da un prologo e da un corpo. Il prologo include una serie di dichiarazioni e di definizioni che contribuiscono a creare l'ambiente necessario per l'elaborazione della query. In SQL Server, il prologo della query XQuery può contenere dichiarazioni dello spazio dei nomi. Il corpo della query XQuery è composto da una sequenza di espressioni che specificano il risultato della query desiderato.
Ad esempio, la query XQuery seguente viene specificata sulla colonna Instructions di tipo xml che archivia le istruzioni di produzione come XML. La query recupera le istruzioni di produzione per il centro di lavorazione 10
. Il query()
metodo del tipo di dati xml viene utilizzato per specificare XQuery.
SELECT Instructions.query('declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root/AWMI:Location[@LocationID=10]
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
Dalla query precedente si noti quanto segue:
Il prologo XQuery include una dichiarazione di prefisso dello spazio dei nomi (AWMI),
(namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
.La parola chiave
declare namespace
definisce un prefisso dello spazio dei nomi che viene utilizzato successivamente nel corpo della query./AWMI:root/AWMI:Location[@LocationID="10"]
è il corpo della query.
Dichiarazioni dello spazio dei nomi
Una dichiarazione dello spazio dei nomi definisce un prefisso e lo associa a un URI (Uniform Resource Identifier) dello spazio dei nomi, come illustrato nella query seguente. Nella query è CatalogDescription
una colonna di tipo xml .
Quando si esegue la query XQuery sulla colonna, il prologo della query specifica la dichiarazione declare namespace
tramite la quale il prefisso PD
, ovvero la descrizione del prodotto, viene associato all'URI dello spazio dei nomi. Questo prefisso viene quindi utilizzato nel corpo della query in sostituzione dell'URI dello spazio dei nomi. I nodi del codice XML risultante sono nello spazio dei nomi associato all'URI dello spazio dei nomi.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
where ProductModelID=19
Per migliorare la leggibilità della query è possibile dichiarare gli spazi dei nomi utilizzando WITH XMLNAMESPACES anziché dichiarare l'associazione tra il prefisso e lo spazio dei nomi nel prologo della query utilizzando declare namespace
.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)
SELECT CatalogDescription.query('
/PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
where ProductModelID=19
Per altre informazioni, vedere Aggiungere spazi dei nomi alle query con WITH XMLNAMESPACES.
Dichiarazione dello spazio dei nomi predefinito
Anziché dichiarare un prefisso dello spazio dei nomi utilizzando la dichiarazione declare namespace
, è possibile utilizzare la dichiarazione declare default element namespace
per associare uno spazio dei nomi predefinito ai nomi degli elementi. In questo caso, non è necessario specificare un prefisso.
Nell'esempio seguente, l'espressione di percorso nel corpo della query non specifica un prefisso dello spazio dei nomi. Per impostazione predefinita, tutti i nomi degli elementi appartengono allo spazio dei nomi predefinito specificato nel prologo.
SELECT CatalogDescription.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/ProductDescription/Summary
') as Result
FROM Production.ProductModel
WHERE ProductModelID=19
Per dichiarare uno spazio dei nomi predefinito è possibile utilizzare WITH XMLNAMESPACES:
WITH XMLNAMESPACES (DEFAULT 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription')
SELECT CatalogDescription.query('
/ProductDescription/Summary
') as Result
FROM Production.ProductModel
WHERE ProductModelID=19