Partilhar via


Expressões quantificadas (XQuery)

Aplica-se a:SQL Server

Quantificadores existenciais e universais especificam semânticas diferentes para operadores booleanos que são aplicados a duas sequências. Isso é mostrado na tabela a seguir.

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

Quantificador universal
Dadas duas sequências, se cada item na primeira sequência tiver uma correspondência na segunda sequência, o valor retornado será True.

XQuery suporta expressões quantificadas na seguinte forma:

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

Você pode usar essas expressões em uma consulta para aplicar explicitamente a quantificação existencial ou universal a uma expressão em uma ou várias sequências. No SQL Server, a expressão na cláusula satisfies deve resultar em um dos seguintes: uma sequência de nós, uma sequê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 alguns retornará True se pelo menos um dos valores vinculados pelo quantificador tiver um resultado True na expressão satisfazer. A quantificação universal que usa cada deve ter True para todos os valores vinculados pelo quantificador.

Por exemplo, a consulta a seguir verifica cada elemento <Location> para ver se ele tem 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 obrigatório 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, conforme mostrado na consulta a seguir. A consulta retornará True se todos os locais do centro de trabalho tiverem atributos LocationID. Caso contrário, a consulta 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 do produto é pequena. No XML do catálogo de produtos, vários ângulos são armazenados para cada imagem de produto de um tamanho diferente. Talvez você queira garantir que cada XML do catálogo de produtos inclua pelo menos uma imagem de tamanho pequeno. A seguinte consulta faz 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:

  • A asserção de tipo não é suportada como parte da ligação da variável nas expressões quantificadas.

Ver também

Expressões XQuery