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
Este tema proporciona ejemplos de XQuery en instancias XML almacenadas en varias columnas de tipo xml de la base de datos AdventureWorks. Para obtener información general de cada una de estas columnas, consulte Representación de tipo de datos xml en la base de datos AdventureWorks.
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 el pró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 en el 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.
El resultado es el siguiente:
ProductModelID Result
-------------- --------------------------------------------
7 <Location LocationID="30" LaborHrs="1"/>
<Location LocationID="50" LaborHrs="3"/>
<Location LocationID="60" LaborHrs="4"/>
Limitaciones de la implementación
Éstas son las limitaciones:
- La función not() sólo admite argumentos del tipo xs:boolean, o node()*, o la secuencia vacía.