Método exista() (Tipo de dados xml)

Retorna um bit que representa uma das seguintes condições:

  • 1, representando Verdadeiro, se a expressão XQuery em uma consulta retornar um resultado nonempty. Quer dizer, retorna no mínimo um nó XML.

  • 0, representando Falso, se retornar um resultado vazio.

  • NULL se a instância de tipo de dado xml na qual a consulta foi executada contiver NULL.

ObservaçãoObservação

O método exist() retorna 1 para a expressão XQuery que retorna um resultado nonempty. Se forem especificadas as funções true() ou false() no método exist(), o método exist() retornará 1, porque as funções true() e false() retornam os valores booleanos verdadeiro e falso, respectivamente. Quer dizer, elas retornam um resultado nonempty. Portanto, exist() retornará 1 (Verdadeiro), como mostrado no seguinte exemplo:

declare @x xml
set @x=''
select @x.exist('true()') 

Sintaxe

exist (XQuery) 

Argumentos

  • XQuery
    É uma expressão XQuery, uma cadeia de caracteres literal.

Exemplos

Os exemplos a seguir mostram como especificar o método exist().

Exemplo: Especificando o método exist() em uma variável de tipo xml

No exemplo a seguir, @x é uma variável de tipo xml (xml sem tipo) e @f é uma variável de tipo inteiro que armazena o valor retornado pelo método exist(). O método exist() retornará Verdadeiro (1) se o valor de data armazenado na instância XML for 2002-01-01.

declare @x xml
declare @f bit
set @x = '<root Somedate = "2002-01-01Z"/>'
set @f = @x.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2002-01-01Z")]')
select @f

Comparando as datas no método exist(), observe o seguinte:

  • O código cast as xs:date? é usado para converter o valor no tipo xs:date para fins de comparação.

  • O valor do atributo @ Somedate é sem tipo. Comparando esse valor, é implícito converter no tipo à direita da comparação, o tipo xs:date.

  • Em vez de cast as xs:date (), é possível usar a função de construtor de xs:date (). Para obter mais informações, consulte Funções do construtor (XQuery).

O exemplo a seguir é semelhante ao anterior, com a exceção de que tem um elemento <Somedate>.

DECLARE @x xml
DECLARE @f bit
SET @x = '<Somedate>2002-01-01Z</Somedate>'
SET @f = @x.exist('/Somedate[(text()[1] cast as xs:date ?) = xs:date("2002-01-01Z") ]')
SELECT @f

Observe o seguinte na consulta anterior:

  • O método text() retorna um nó de texto que contém o valor sem tipo 2002-01-01. (O tipo XQuery é xdt:untypedAtomic.) É necessário converter explicitamente esse valor digitado de x para xsd:date, porque a conversão implícita não possui suporte nesse caso.

Exemplo: Especificando o método exist() em uma variável xml digitada

O exemplo a seguir ilustra o uso do método exist() em uma variável do tipo xml . É uma variável XML digitada, porque especifica o nome de coleção de namespace do esquema, ManuInstructionsSchemaCollection.

No exemplo, um documento de instruções de fabricação é atribuído primeiro a essa variável e depois ao método exist() usado para descobrir se o documento inclui um elemento <Location> cujo valor de atributo LocationID é 50.

O método exist() especificado na variável @x retornará 1 (Verdadeiro) se o documento de instruções de fabricação incluir um elemento <Location> que tenha LocationID=50. Caso contrário, o método retornará 0 (Falso).

DECLARE @x xml (Production.ManuInstructionsSchemaCollection)
SELECT @x=Instructions
FROM Production.ProductModel
WHERE ProductModelID=67
--SELECT @x
DECLARE @f int
SET @f = @x.exist(' declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
    /AWMI:root/AWMI:Location[@LocationID=50]
')
SELECT @f

Exemplo: Especificando o método exist() em uma coluna de tipo xml

A consulta a seguir recupera as IDs de modelos de produtos cujas descrições no catálogo não incluem as especificações, o elemento <Specifications>:

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

Observe o seguinte na consulta anterior:

  • A cláusula WHERE seleciona somente as linhas da tabela ProductDescription que satisfazem a condição especificada na coluna do tipo CatalogDescription xml.

  • O método exist() na cláusula WHERE retornará 1 (Verdadeiro) se o XML não incluir nenhum elemento <Specifications>. Observe o uso de not() function (XQuery).

  • A função sql:column() function (XQuery) é usada para obter o valor de uma coluna de não XML.

  • Essa consulta retorna um conjunto de linhas vazias.

A consulta especifica os métodos query() e exist() do tipo de dados xml e os dois métodos declaram os mesmos namespaces no prólogo da consulta. Nesse caso, é possível usar WITH XMLNAMESPACES para declarar o prefixo e usá-lo na consulta.

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)]'
    ) = 1