Wyrażenia kwantyfikowane (XQuery)
Dotyczy:programu SQL Server
Egzystencjalne i uniwersalne kwantyfikatory określają różne semantyki dla operatorów logicznych, które są stosowane do dwóch sekwencji. Jest to pokazane w poniższej tabeli.
kwantyfikator egzystencjalny
Biorąc pod uwagę dwie sekwencje, jeśli dowolny element w pierwszej sekwencji ma dopasowanie w drugiej sekwencji, na podstawie używanego operatora porównania zwracana wartość to True.
uniwersalny kwantyfikator
Biorąc pod uwagę dwie sekwencje, jeśli każdy element w pierwszej sekwencji ma dopasowanie w drugiej sekwencji, zwracana wartość ma wartość True.
Funkcja XQuery obsługuje wyrażenia kwantyfikowane w następującej postaci:
( some | every ) <variable> in <Expression> (,...) satisfies <Expression>
Tych wyrażeń można użyć w zapytaniu, aby jawnie zastosować egzystencjalne lub uniwersalne kwantyfikację do wyrażenia w jednej lub kilku sekwencjach. W programie SQL Server wyrażenie w klauzuli satisfies
musi spowodować jedną z następujących wartości: sekwencję węzłów, pustą sekwencję lub wartość logiczną. Efektywna wartość logiczna wyniku tego wyrażenia będzie używana w kwantyfikacji. Kwantyfikacja egzystencji używająca niektórych zwróci wartość True, jeśli co najmniej jedna z wartości powiązanych przez kwantyfikator ma wynik True w wyrażeniu spełniającym wymagania. Uniwersalne kwantyfikacja używająca każdego musi mieć wartość True dla wszystkich wartości powiązanych przez kwantyfikator.
Na przykład następujące zapytanie sprawdza każdy element <Location>, aby sprawdzić, czy ma atrybut 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
Ponieważ LocationID jest wymaganym atrybutem elementu <Location>, otrzymasz oczekiwany wynik:
<Result>All work centers have Location ID</Result>
Zamiast używać metody query(), możesz użyć metody value(), aby zwrócić wynik do świata relacyjnego, jak pokazano w poniższym zapytaniu. Zapytanie zwraca wartość True, jeśli wszystkie lokalizacje centrum roboczego mają atrybuty LocationID. W przeciwnym razie zapytanie zwraca wartość 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
Poniższe zapytanie sprawdza, czy jeden z obrazów produktu jest mały. W pliku XML wykazu produktów różne kąty są przechowywane dla każdego obrazu produktu o innym rozmiarze. Warto upewnić się, że każdy kod XML wykazu produktów zawiera co najmniej jeden obraz o małym rozmiarze. Następujące zapytanie wykonuje następujące czynności:
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
Jest to częściowy wynik:
ProductModelID SmallPicturesStored
-------------- --------------------
19 true
Ograniczenia implementacji
Są to ograniczenia:
- Aseracja typu nie jest obsługiwana w ramach powiązania zmiennej w wyrażeniach kwantyfikowanych.