Kvantifierade uttryck (XQuery)

Gäller för:SQL Server

Existentiella och universella kvantifikatorer specificerar olika semantik för booleska operatorer som tillämpas på två följder. Detta visas i följande tabell.

Existentiell kvantifikator
Givet två sekvenser, om något objekt i den första sekvensen har en matchning i den andra sekvensen, baserat på den jämförelseoperator som används, är det returnerade värdet True.

Universell kvantifikator
Givet två sekvenser, om varje element i den första sekvensen har en matchning i den andra sekvensen, är det returnerade värdet Sann.

XQuery stöder kvantifierade uttryck i följande form:

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

Du kan använda dessa uttryck i en fråga för att explicit tillämpa antingen existentiell eller universell kvantifiering på ett uttryck över en eller flera sekvenser. I SQL Server måste uttrycket i satsen satisfies resultera i något av följande: en nodsekvens, en tom sekvens eller ett booleskt värde. Det effektiva boolesk värdet av resultatet av det uttrycket kommer att användas i kvantifieringen. Den existentiella kvantifieringen som använder vissa kommer att ge True om minst ett av värdena som begränsas av kvantifikatorn har ett True-resultat i tillfredsställelseuttrycket. Den universella kvantifieringen som använder varje måste ha True för alla värden bundna av kvantifikatorn.

Till exempel kontrollerar följande fråga varje <Plats-element> för att se om det har ett LocationID-attribut.

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  

Eftersom LocationID är ett obligatoriskt attribut för Location-elementet <> får du det förväntade resultatet:

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

Istället för att använda query()-metoden kan du använda value()-metoden för att returnera resultatet till relationsvärlden, som visas i följande fråga. Frågan returnerar True om alla arbetsplatsplatser har LocationID-attribut. Annars returnerar frågan 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  

Följande fråga kontrollerar om en av produktbilderna är liten. I produktkatalogen XML lagras olika vinklar för varje produktbild av olika storlek. Du kan vilja se till att varje produktkatalog-XML innehåller minst en liten bild. Följande fråga uppnår detta:

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  

Detta är ett partiellt resultat:

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

Implementeringsbegränsningar

Det här är begränsningarna:

  • Typassertion stöds inte som en del av att binda variabeln i de kvantifierade uttrycken.