not (función de XQuery)

Devuelve TRUE si el valor booleano efectivo de $arg es False, y devuelve FALSE si el valor booleano efectivo de $arg es True.

Sintaxis

fn:not($arg as item()*) as xs:boolean

Argumentos

  • $arg
    Secuencia de elementos para los que existe un valor booleano efectivo.

Ejemplos

En este tema se ofrecen ejemplos de XQuery con instancias XML almacenadas en varias columnas de tipo xml en la base de datos AdventureWorks2008R2. Para obtener información general de cada una de estas columnas, vea Representación de tipo de datos xml en la base de datos AdventureWorks2008R2.

A. Usar la función not() de XQuery para buscar modelos de producto cuyas descripciones de catálogo no incluyen el elemento <Specifications>.

La siguiente consulta genera XML que contiene identificadores correspondientes a modelos de producto cuyas descripciones de catálogo no incluyen el elemento <Specifications>.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID, CatalogDescription.query('
       <Product 
           ProductModelID="{ sql:column("ProductModelID") }"
        />
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist('
     /pd:ProductDescription[not(pd:Specifications/*)]  '
     ) = 0;

Observe lo siguiente en la consulta anterior:

  • Dado que el documento utiliza espacios de nombres, en el ejemplo se utiliza la instrucción WITH NAMESPACES. Otra opción es usar la palabra clave declare namespace en elprólogo de las consultas XQuery para definir el prefijo.

  • En tal caso, la consulta genera el XML que incluye el elemento <Product> y su atributo ProductModelID.

  • La cláusula WHERE utiliza el método exist() del tipo de datos XML para filtrar las filas. El método exist() devuelve True si hay elementos <ProductDescription> que no contienen elementos secundarios <Specification>. Observe el uso de la función not().

Este conjunto de resultados está vacío porque todas las descripciones de catálogo de los modelos de producto incluyen el elemento <Specifications>.

B. Usar la función not() de XQuery para recuperar ubicaciones de centros de trabajo que no contienen el atributo MachineHours.

La siguiente consulta se especifica para la columna Instructions. En esta columna, se almacenan las instrucciones de fabricación de los modelos de producto.

Para un modelo de producto determinado, la consulta recupera las ubicaciones de los centros de trabajo para las que no se ha especificado MachineHours. Es decir, que no se ha especificado el atributo MachineHours para el elemento <Location>.

SELECT ProductModelID, Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions" ;
     for $i in /AWMI:root/AWMI:Location[not(@MachineHours)]
     return
       <Location LocationID="{ $i/@LocationID }" 
                   LaborHrs="{ $i/@LaborHours }" >
        </Location>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7; 

En la consulta anterior, observe lo siguiente:

  • El elemento declare namespace del prólogo de las consultas XQuery define el prefijo del espacio de nombres de las instrucciones de fabricación de Adventure Works. Representa el mismo espacio de nombres utilizado en el documento de instrucciones de fabricación.

  • En la consulta, el predicado not(@MachineHours) devuelve True si no existe el atributo MachineHours.

Este es el resultado:

ProductModelID Result

-------------- --------------------------------------------

7 <Location LocationID="30" LaborHrs="1"/>

<Location LocationID="50" LaborHrs="3"/>

<Location LocationID="60" LaborHrs="4"/>

Limitaciones de la implementación

Estas son las limitaciones:

  • La función not() solo admite argumentos del tipo xs:boolean, o node()*, o la secuencia vacía.