Expressões quantificadas (XQuery)

Os quantificadores existenciais e universais especificam semânticas diferentes para operadores Booleanos que são aplicados a duas seqüências. Isso é mostrado na tabela a seguir.

  • Quantificador existencial
    Considerando-se duas seqüências, se qualquer item na primeira seqüência tiver uma correspondência na segunda seqüência, com base no operador de comparação usado, o valor retornado será True.

  • Quantificador universal
    Considerando-se duas seqüências, se cada item na primeira seqüência tiver uma correspondência na segunda seqüência, o valor retornado será True.

O XQuery oferece suporte a expressões quantificadas da seguinte forma:

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

Você pode usar essas expressões em uma consulta para aplicar explicitamente quantificação existencial ou universal a uma expressão em uma ou em várias seqüências. No SQL Server, a expressão na cláusula satisfies deve resultar em um dos seguintes: uma seqüência de nó, uma seqüência vazia ou um valor Booleano. O valor Booleano efetivo do resultado dessa expressão será usado na quantificação. A quantificação existencial que usa some retornará True se pelo menos um dos valores associado pelo quantificador tiver um resultado na expressão de satisfação. A quantificação universal que usa every deve ter True em todos os valores associados pelo quantificador.

Por exemplo, a consulta a seguir verifica todo elemento <Location> para verificar se ele tem ou não um atributo 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

Como LocationID é um atributo exigido do elemento <Location>, você recebe o resultado esperado:

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

Em vez de usar o método query(), você pode usar o método value() para retornar o resultado ao mundo relacional, como mostrado na consulta a seguir. A consulta retornará True se todos os locais de centro de trabalho tiverem atributos LocationID. Caso contrário, a função retornará 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

A consulta a seguir verifica se uma das imagens de produto é pequena. No catálogo de produto XML, são armazenados vários ângulos para cada imagem de produto de um tamanho diferente. Convém garantir que cada catálogo de produto XML inclua, pelo menos, uma imagem de tamanho pequeno. A consulta a seguir realiza isso:

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

Este é um resultado parcial:

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

Limitações de implementação

Estas são as limitações:

  • Não há suporte para a asserção de tipo como parte da associação da variável nas expressões quantificadas.

Consulte também

Conceitos