Espressioni quantificate (XQuery)

I quantificatori esistenziali e universali specificano una semantica diversa per gli operatori booleani applicati a due sequenze, come illustrato nella tabella seguente.

  • Quantificatore esistenziale
    Date due sequenze, se un elemento della prima sequenza ha una corrispondenza nella seconda sequenza, in base all'operatore di confronto utilizzato, viene restituito il valore True.

  • Quantificatore universale
    Date due sequenze, se tutti gli elementi della prima sequenza hanno una corrispondenza nella seconda sequenza viene restituito il valore True.

XQuery supporta le espressioni quantificate nel formato seguente:

( some | every ) <variable> in <Expression> (,…) satisfies <Expression>

È possibile utilizzare queste espressioni in una query per applicare esplicitamente la quantificazione esistenziale o universale a un'espressione su una o più sequenze. In SQL Server, l'espressione nella clausola satisfies deve generare una sequenza di nodi, una sequenza vuota oppure un valore booleano. Il valore booleano effettivo del risultato dell'espressione verrà utilizzato nella quantificazione. La quantificazione esistenziale che utilizza some restituirà True se almeno uno dei valori associati dal quantificatore ha un risultato True nell'espressione nella clausola satisfies. La quantificazione universale che utilizza every deve avere True per tutti i valori associati dal quantificatore.

Ad esempio, la query seguente controlla tutti gli elementi <Location> per verificare la presenza di un attributo LocationID.

SELECT Instructions.query('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
        if (every $WC in //AWMI:root/AWMI:Location 
            satisfies $WC/@LocationID)
        then
             <Result>All work centers have workcenterLocation ID</Result>
         else
             <Result>Not all work centers have workcenterLocation ID</Result>
') as Result
FROM Production.ProductModel
where ProductModelID=7

Poiché LocationID è un attributo obbligatorio dell'elemento <Location>, si riceve il risultato previsto:

<Result>All work centers have Location ID</Result> 

Invece di utilizzare il metodo query() è possibile utilizzare il metodo value() per la restituzione del risultato a un sistema relazionale, come illustrato nella query seguente. La query restituisce True se tutti i centri di lavorazione includono attributi LocationID. In caso contrario, la funzione restituisce False.

SELECT Instructions.value('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
        every $WC in  //AWMI:root/AWMI:Location 
            satisfies $WC/@LocationID', 
  'nvarchar(10)') as Result
FROM Production.ProductModel
where ProductModelID=7

La query seguente verifica se una delle immagini del prodotto è di piccole dimensioni. Nel codice XML del catalogo prodotti sono archiviate varie angolazioni per ogni dimensione di immagine dei prodotti. Può essere necessario verificare che il codice XML del catalogo prodotti includa almeno un'immagine di piccole dimensioni. La query seguente esegue questa operazione:

SELECT ProductModelID, CatalogDescription.value('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     some $F in /PD:ProductDescription/PD:Picture
        satisfies $F/PD:Size="small"', 'nvarchar(20)') as SmallPicturesStored
FROM Production.ProductModel
WHERE ProductModelID = 19

Risultato parziale:

ProductModelID SmallPicturesStored 
-------------- --------------------
19             true      

Limitazioni di implementazione

Limitazioni:

  • L'asserzione del tipo non è supportata come parte dell'associazione della variabile nelle espressioni quantificate.

Vedere anche

Concetti