Compartilhar via


Função not (XQuery)

Retornará TRUE se o valor Booleano efetivo de $arg for falso, e retornará FALSE se o valor Booleano efetivo de $arg for verdadeiro.

Sintaxe

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

Argumentos

  • $arg
    Uma seqüência de itens para quais há um valor Booleano efetivo.

Exemplos

Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas do tipo xml no banco de dados AdventureWorks. Para obter uma visão geral de cada uma dessas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks.

A. Usando a função not() XQuery para localizar modelos de produto cujas descrições de catálogo não incluem o elemento <Specifications>.

A consulta a seguir constrói um XML que contém IDs de modelos de produto para modelos de produto cujas descrições de catálogo não incluem o 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 o seguinte na consulta anterior:

  • Como documento usa namespaces, a amostra usa a instrução WITH NAMESPACES. Outra opção é usar a palavra-chave declare namespace no Prólogo do XQuery para definir o prefixo.

  • A consulta então constrói o XML que inclui o elemento <Product> e seu atributo de ProductModelID.

  • A cláusula WHERE usa o método exist() (tipo de dados XML) para filtrar as linhas. O método exist() retornará True se houver elementos <ProductDescription> que não tenham elementos filho <Specification>. Observe o uso da função not().

Esse conjunto de resultados está vazio, porque cada descrição de catálogo do modelo de produto inclui o elemento <Specifications>.

B. Usando a função not() XQuery para recuperar locais de centro de trabalho que não têm um atributo MachineHours

A consulta a seguir é especificada na coluna Instructions. Essa coluna armazena instruções de fabricação para os modelos de produtos.

Para um modelo de produto em particular, a consulta recupera locais de centro de trabalho que não especificam MachineHours. Quer dizer, o atributo MachineHours não é especificado para o 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 

Observe o seguinte na consulta anterior:

  • A palavra-chave declare namespace no Prólogo do XQuery define o prefixo de namespace das instruções de fabricação do Adventure Works. Ela representa o mesmo namespace usado no documento de instruções de fabricação.

  • Na consulta, o predicado not(@ MachineHours) retornará True se não houver um atributo MachineHours.

Este é o resultado:

ProductModelID Result 
-------------- --------------------------------------------
7              <Location LocationID="30" LaborHrs="1"/>
               <Location LocationID="50" LaborHrs="3"/>
               <Location LocationID="60" LaborHrs="4"/>

Limitações de implementação

Estas são as limitações:

  • A função not() só oferece suporte a argumentos do tipo xs:boolean, ou node()*, ou à seqüência vazia.

Consulte também

Referência