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çã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()')
exist (XQuery)
- XQuery
É uma expressão XQuery, uma cadeia de caracteres literal.
Os exemplos a seguir mostram como especificar o método exist().
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.
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
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
Adicionar namespaces a consultas com WITH XMLNAMESPACES
Comparar XML digitado com XML não digitado