Metodo query() con tipo di dati XML

Si applica a:SQL Server database SQL di Azure Istanza gestita di SQL di Azure

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')  

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Argomenti

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

Esempi

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

R. Utilizzo del metodo query() in una variabile di tipo XML

L'esempio seguente dichiara una variabile @myDoc di tipo xml e assegna a questa un'istanza XML. In seguito viene usato 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')  

Nell'output seguente viene visualizzato il 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() in una colonna di tipo XML

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

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, ovvero ad essa è associata una raccolta di schemi. Nel prologo di una query XQuery, la parola chiave namespace definisce il prefisso incluso in seguito nel corpo della query.

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

  • Il metodo exist() (tipo di dati XML) nella clausola WHERE trova solo le righe che contengono l'elemento <Warranty> nella struttura XML. Anche in questo caso la parola chiave namespace definisce due prefissi dello spazio dei nomi.

Nell'output seguente viene parzialmente visualizzato il report:

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

Osservare come i metodi query() ed exist() dichiarino 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;

Vedi anche

Aggiungere spazi dei nomi alle query con WITH XMLNAMESPACES
Confrontare dati XML tipizzati con dati XML non tipizzati
Creare istanze di dati XML
metodi con tipo di dati xml
Linguaggio XML di manipolazione dei dati (XML DML)