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

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

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 dados xml na qual a consulta foi executada contiver NULL.

Sintaxe

exist (XQuery)   

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Argumentos

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

Comentários

Observação

O método exist() retorna 1 para a expressão XQuery que retorna um resultado não vazio. Se você especificar as funções true() ou false() no método exist() , o método exist() retornará 1, porque as funções true() e false() retornam Boolean True e False, respectivamente. Quer dizer, elas retornam um resultado nonempty. Portanto, exist() retornará 1 (True), conforme mostrado no seguinte exemplo:

DECLARE @x XML;  
SET @x='';  
SELECT @x.exist('true()');   

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 não tipado) e @f é uma variável de tipo inteiro que armazena o valor retornado pelo método exist() . O método exist() retorna True (1) se o valor de data armazenado na instância de XML é 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 é não tipado. Comparando esse valor, ele é implicitamente convertido no tipo do lado direito da comparação, o tipo xs:date.

  • Em vez de cast as xs:date() , use a função de construtor xs:date() . Para obter mais informações, confira Funções de 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 não tipado 2002-01-01. (O tipo XQuery é xdt:untypedAtomic.) É necessário converter explicitamente esse valor tipado de x para xsd:date, porque a conversão implícita não é compatível, 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, em seguida, o método exist() é usado para descobrir se o documento inclui um elemento <Location> cujo valor do atributo LocationID é 50.

O método exist() especificado na variável @x retornará 1 (Verdadeiro) se o documento de instruções de fabricação inclui um elemento <Location> que tem 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 atendem à condição especificada na coluna do tipo CatalogDescription xml.

  • O método exist() na cláusula WHERE retorna 1 (Verdadeiro) se o XML não inclui nenhum elemento <Specifications>. Observe o uso da função not() (XQuery).

  • A função sql:column() (XQuery) é usada para obter o valor de uma coluna 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

Adicionar namespaces a consultas com WITH XMLNAMESPACES
Comparar XML tipado com XML não tipado
Criar instâncias de dados XML
Métodos de Tipos de Dados XML
Linguagem de modificação de dados XML (XML DML)