Espressioni quantificate (XQuery)
Si applica a: SQL Server
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 satisfies
clausola deve comportare una delle operazioni seguenti: una sequenza di nodi, una sequenza vuota o un valore booleano. Il valore booleano effettivo del risultato dell'espressione verrà utilizzato nella quantificazione. La quantificazione esistenziale che utilizza alcuni restituirà True se almeno uno dei valori associati dal quantificatore ha un risultato True nell'espressione di soddisfazione. La quantificazione universale che usa ogni oggetto deve avere True per tutti i valori associati dal quantificatore.
Ad esempio, la query seguente controlla ogni <elemento Location> per verificare se ha 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> , viene visualizzato il risultato previsto:
<Result>All work centers have Location ID</Result>
Anziché usare il metodo query(), è possibile usare il metodo value() per restituire il risultato al mondo 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.