Expressões quantificadas (XQuery)
Aplica-se a:SQL Server
Os quantificadores existenciais e universais especificam semânticas diferentes para operadores Boolianos que são aplicados a duas sequências. Isso é mostrado na tabela a seguir.
Quantificador existencial
Considerando-se 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
Considerando-se duas sequências, se cada item na primeira sequência tiver uma correspondência na segunda sequê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 sequências. Em SQL Server, a expressão na satisfies
cláusula deve resultar em uma das seguintes opções: uma sequência de nó, uma sequência vazia ou um valor booliano. O valor Booliano 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 associados pelo quantificador tiver um resultado True na expressão de satisfação. A quantificação universal que usa cada deve ter True para todos os valores associados 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 para o mundo relacional, conforme mostrado na consulta a seguir. A consulta retornará True se todos os locais de 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 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.