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 boolianos 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

Consulte também

Conceitos

Adicionar namespaces a consultas com WITH XMLNAMESPACES

Comparar XML digitado com XML não digitado

Criar instâncias de dados XML

Linguagem de modificação de dados XML (XML DML)

Outros recursos

Métodos de tipo de dados xml