Udostępnij za pośrednictwem


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.

Zobacz też

wyrażenia XQuery