Compartir a través de


Expresiones cuantificadas (XQuery)

Se aplica a:SQL Server

Los cuantificadores existenciales y universales especifican semánticas distintas para los operadores booleanos que se aplican a dos secuencias. Esto se muestra en la tabla siguiente.

Cuantificador existencial
Dadas dos secuencias, si algún elemento de la primera tiene una coincidencia en la segunda, según el operador de comparación utilizado, el valor devuelto será True.

Cuantificador universal
Dadas dos secuencias, si cada elemento de la primera tiene una coincidencia en la segunda, el valor devuelto será True.

XQuery admite las expresiones cuantificadas de la forma siguiente:

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

Puede utilizar estas expresiones en una consulta para aplicar explícitamente una cuantificación existencial o universal a una expresión en una o varias secuencias. En SQL Server, la expresión de la satisfies cláusula tiene que dar lugar a uno de los siguientes elementos: una secuencia de nodo, una secuencia vacía o un valor booleano. El valor booleano efectivo del resultado de la expresión se utilizará en la cuantificación. La cuantificación existencial que usa algunos devolverá True si al menos uno de los valores enlazados por el cuantificador tiene un resultado True en la expresión de satisfacción. La cuantificación universal que usa cada debe tener True para todos los valores enlazados por el cuantificador.

Por ejemplo, la siguiente consulta comprueba cada <elemento Location> para ver si tiene un 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  

Dado que LocationID es un atributo obligatorio del <elemento Location> , recibirá el resultado esperado:

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

En lugar de usar el método query(), puede usar el método value() para devolver el resultado al mundo relacional, como se muestra en la consulta siguiente. La consulta devolverá True si todas las ubicaciones de centro de trabajo tienen atributos LocationID. De lo contrario, la consulta devolverá 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  

La consulta siguiente comprueba si una de las imágenes de producto es pequeña. En el XML de catálogo de productos, se almacenan varios ángulos para cada imagen de producto de distinto tamaño. Asegúrese también de que cada XML de catálogo de productos incluye al menos una imagen pequeña. La consulta siguiente permite comprobarlo:

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  

Éste es un resultado parcial:

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

Limitaciones de la implementación

Éstas son las limitaciones:

  • La aserción de tipos no se admite como parte del enlazamiento de la variable en las expresiones cuantificadas.

Consulte también

Expresiones XQuery