Metodo query() con tipo di dati XML

Specifica una query XQuery su un'istanza con tipo di dati xml. Il risultato è di tipo xml. Il metodo restituisce un'istanza XML non tipizzata.

Sintassi

query ('XQuery')

Argomenti

  • XQuery
    Stringa costituita da un'espressione XQuery che esegue query su nodi XML, ad esempio elementi o attributi, in un'istanza XML.

Esempi

In questa sezione sono disponibili esempi di utilizzo del metodo query() con tipo di dati xml.

A. Utilizzo del metodo query() per una variabile di tipo XML

Nell'esempio seguente viene dichiarata una variabile @myDoc di tipo xml a cui viene assegnata un'istanza XML. In seguito, viene utilizzato il metodo query() per specificare una query XQuery sul documento.

La query recupera l'elemento figlio <Features> dell'elemento <ProductDescription>:

declare @myDoc xml
set @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'
SELECT @myDoc.query('/Root/ProductDescription/Features')

Risultato:

<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>      

B. Utilizzo del metodo query() per una colonna di tipo XML

Nell'esempio seguente viene utilizzato il metodo query() per specificare una query XQuery sulla colonna CatalogDescription di tipo xml nel database AdventureWorks2008R2:

SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1

Dalla query precedente si noti quanto segue:

  • La colonna CatalogDescription è una colonna xml tipizzata. Pertanto, è disponibile il relativo schema associato. Nel prologo di una query XQuery, la parola chiave namespace viene utilizzata per definire il prefisso incluso in seguito nel corpo della query.

  • Il metodo query() costruisce una struttura XML, un elemento <Product> con un attributo ProductModelID, in cui il valore dell'attributo ProductModelID viene recuperato dal database. Per ulteriori informazioni sulla costruzione di strutture XML, vedere Costruzione di strutture XML (XQuery).

  • Il metodo exist() (tipo di dati XML) nella clausola WHERE viene utilizzato per trovare solo le righe che contengono l'elemento <Warranty> nella struttura XML. Viene utilizzata nuovamente la parola chiave namespace per definire due prefissi dello spazio dei nomi.

Risultato parziale:

<Product ProductModelID="19"/> 
<Product ProductModelID="23"/> 
...

Si noti che i metodi query() ed exist() dichiarano entrambi il prefisso PD. In tali casi, è possibile utilizzare WITH XMLNAMESPACES per definire innanzitutto i prefissi e utilizzarli nella query.

WITH XMLNAMESPACES (
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,
   'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1