Kvantifikované výrazy (XQuery)

platí pro:SQL Server

Existenciální a univerzální kvantifikátory specifikují odlišnou sémantiku pro Booleovské operátory, které se aplikují na dvě posloupnosti. To je znázorněno v následující tabulce.

Existenciální kvantifikátor
Máme dvě posloupnosti, pokud má některá položka v první posloupnosti shodu ve druhé posloupnosti, na základě použitého srovnávacího operátoru je vrácená hodnota True.

Univerzální kvantifikátor
Dáme-li dvě posloupnosti, pokud má každý prvek v první posloupnosti shodu ve druhé posloupnosti, vrácená hodnota je Pravda.

XQuery podporuje kvantifikované výrazy v následující podobě:

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

Tyto výrazy můžete použít v dotazu k explicitnímu použití buď existenční, nebo univerzální kvantifikace na výraz přes jednu nebo více sekvencí. V SQL Server musí výraz v klauzuli satisfies vést k jedné z následujících hodnot: sekvenci uzlů, prázdné sekvenci nebo Booleovské hodnotě. Efektivní booleovská hodnota výsledku tohoto výrazu bude použita v kvantifikaci. Existenční kvantifikace, která používá něco , vrátí True, pokud alespoň jedna z hodnot vázaných kvantifikátorem má výsledek True ve výrazu splnit. Univerzální kvantifikace, která používá každý, musí mít True pro všechny hodnoty vázané kvantifikátorem.

Například následující dotaz kontroluje každý <prvek Location> , zda má atribut 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  

Protože LocationID je povinným atributem prvku <Location> , obdržíte očekávaný výsledek:

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

Místo použití metody query() můžete použít metodu value() k vrácení výsledku do relačního světa, jak je ukázáno v následujícím dotazu. Dotaz vrací True, pokud všechna místa pracovních center mají atributy LocationID. Jinak dotaz vrátí 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  

Následující dotaz kontroluje, zda je některá z obrázků produktu malá. V XML katalogu produktu jsou pro každý obrázek produktu jiné velikosti uloženy různé úhly. Možná budete chtít zajistit, aby každý XML katalogu produktu obsahoval alespoň jednu malou fotografii. Následující dotaz to umožňuje:

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  

Jedná se o částečný výsledek:

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

Omezení implementace

Toto jsou omezení:

  • Typové tvrzení není podporováno jako součást vázání proměnné v kvantifikovaných výrazech.