Partilhar via


Método exist() (Tipo de Dados xml)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

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

  • 1, representando Verdadeiro, se a expressão XQuery numa consulta devolve um resultado não vazio. Ou seja, devolve pelo menos um nó XML.

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

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

Sintaxe

exist (XQuery)   

Arguments

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

Observações

Observação

O método exist() devolve 1 para a expressão XQuery que devolve um resultado não vazio. Se especificar as funções true() ou false() dentro do método existir(), o método existir() devolverá 1, porque as funções true() e false() retornam Boolean True e False, respetivamente. Ou seja, devolvem um resultado não vazio). Portanto, exist() devolverá 1 (Verdadeiro), como mostrado no seguinte exemplo:

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

Examples

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

Exemplo: Especificar o método exist() contra uma variável do tipo xml

No exemplo seguinte, @x é uma variável do tipo xml (xml não tipado) e @f é uma variável do tipo inteiro que armazena o valor devolvido pelo método exist( ). O método exist() devolve True (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;  

Ao comparar datas no método exist(), note o seguinte:

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

  • O valor do atributo @Somedate não está tipado. Ao comparar este valor, ele é implicitamente cast para o tipo do lado direito da comparação, o tipo xs:data .

  • Em vez de castar como xs:date(), podes usar a função construtora xs:date(). Para mais informações, veja Funções Construtoras (XQuery).

O exemplo seguinte é semelhante ao anterior, exceto que tem um <Somedate> elemento.

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 da consulta anterior:

  • O método text() devolve um nó de texto que contém o valor 2002-01-01não tipado . (O tipo XQuery é xdt:untypedAtomic.) Deve explicitamente castar este valor tipado de x para xsd:date, porque o casting implícito não é suportado neste caso.

Exemplo: Especificar o método exist() contra uma variável xml tipada

O exemplo seguinte ilustra a utilização do método exist() contra uma variável do tipo xml . É uma variável XML tipada, porque especifica o nome da coleção do espaço de nomes do esquema, ManuInstructionsSchemaCollection.

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

O método exist() especificado contra a @x variável retorna 1 (Verdadeiro) se o documento de instruções de fabrico incluir um<Location>elemento que tenha .LocationID=50 Caso contrário, o método retorna 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: Especificar o método exist() contra uma coluna do tipo xml

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

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 da consulta anterior:

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

  • O método exist() na cláusula WHERE devolve 1 (True) se o XML não incluir nenhum <Specifications> elemento. Note-se o uso da função not() (XQuery).

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

  • Esta consulta devolve um conjunto de linhas vazio.

A consulta especifica os métodos query() e exist() do tipo de dado xml e ambos os métodos declaram os mesmos namespaces no prólogo da consulta. Neste caso, pode querer 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;  

Ver também

Adicionar namespaces a consultas com WITH XMLNAMESPACES
Comparar XML digitado 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)