Share via


Expresiones cuantificadas (XQuery)

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 cláusula satisfies debe dar uno de los resultados siguientes: una secuencia de nodos, 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 utilice some 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 utilice every debe tener True en todos los valores enlazados por el cuantificador.

Por ejemplo, la consulta siguiente comprueba cada elemento <Ubicación> 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

Puesto que LocationID es un atributo obligatorio del elemento <Ubicación>, recibirá el resultado esperado:

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

En lugar de utilizar el método query(), puede utilizar el método value() para devolver el resultado al mundo relacional, tal 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.

Vea también

Conceptos