Compartir a través de


exist() (método del tipo de datos xml)

Devuelve un bit que representa una de las condiciones siguientes:

  • 1, que representa True, si la expresión XQuery de una consulta devuelve un resultado no vacío, es decir, si devuelve al menos un nodo XML.

  • 0, que representa False, si devuelve un resultado vacío.

  • NULL si la instancia con datos del tipo xml con la que se ejecuta la consulta incluye valores NULL.

[!NOTA]

El método exist() devuelve 1 para la expresión XQuery que devuelve un resultado no vacío. Si se especifican las funciones true() o false() dentro del método exist(), el método exist() devolverá 1, porque las funciones true() y false() devuelven los valores booleanos True y False respectivamente. En otras palabras, devuelven un resultado no vacío. Por tanto, exist() devolverá 1 (True), como se muestra en el ejemplo siguiente:

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

Sintaxis

exist (XQuery) 

Argumentos

  • XQuery
    Es una expresión XQuery, un literal de cadena.

Ejemplos

En los ejemplos siguientes se muestra cómo especificar el método exist().

Ejemplo: especificar el método exist() con una variable de tipo xml

En el ejemplo siguiente, @x es una variable de tipo xml (xml sin tipo) y @f es una variable de tipo entero que almacena el valor devuelto por el método exist(). El método exist() devuelve True (1) si el valor de fecha almacenado en la instancia XML es 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

Al comparar las fechas del método exist(), tenga en cuenta lo siguiente:

  • El código cast as xs:date? se utiliza para convertir el valor al tipo xs:date con fines comparativos.

  • El valor del atributo @Somedate no tiene tipo. Al comparar este valor, se convierte implícitamente al tipo de la derecha de la comparación, el tipo xs:date.

  • En lugar de cast as xs:date(), puede utilizar la función constructora xs:date(). Para obtener más información, vea Funciones de constructor (XQuery).

El ejemplo siguiente es similar al anterior, con la diferencia de que tiene un 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 lo siguiente en la consulta anterior:

  • El método text() devuelve un nodo de texto que incluye el valor sin tipo 2002-01-01. El tipo XQuery es xdt:untypedAtomic. Debe convertir explícitamente este valor con tipo de x a xsd:date, puesto que en este caso no se admite la conversión implícita.

Ejemplo: especificar el método exist() con una variable xml con tipo

En el ejemplo siguiente se muestra el uso del método exist() con una variable del tipo xml. Se trata de una variable XML con tipo, pues especifica el nombre de la colección del espacio de nombres del esquema, ManuInstructionsSchemaCollection.

En este ejemplo, en primer lugar se asigna a esta variable un documento con instrucciones de fabricación y, a continuación, se utiliza el método exist() para comprobar si el documento incluye un elemento <Location> cuyo valor del atributo LocationID es 50.

El método exist() especificado con la variable @x devuelve 1 (True) si el documento con instrucciones de fabricación incluye un elemento <Location> con LocationID=50. De lo contrario, el método devolverá 0 (False).

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

Ejemplo: especificar el método exist() con una columna de tipo xml

La consulta siguiente recupera los Id. de modelo de producto cuyas descripciones de catálogo no incluyen las especificaciones, 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 lo siguiente en la consulta anterior:

  • La cláusula WHERE selecciona únicamente las filas de la tabla ProductDescription que satisfacen la condición especificada en la columna de tipo CatalogDescription xml.

  • El método exist() de la cláusula WHERE devuelve 1 (True) si el XML no incluye ningún elemento <Specifications>. Observe la utilización de la función de XQuery not().

  • La función de XQuery sql:column() se utiliza para recuperar el valor de una columna distinta de XML.

  • Esta consulta devuelve un conjunto de filas vacío.

La consulta especifica los métodos query() y exist() del tipo de datos xml, y ambos métodos declaran los mismos espacios de nombres en el prólogo de la consulta. En este caso, puede utilizar WITH XMLNAMESPACES para declarar el prefijo y utilizarlo en la 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

Vea también

Conceptos

Agregar espacios de nombres a consultas con WITH XMLNAMESPACES

Comparar XML con tipo y XML sin tipo

Crear instancias de datos XML

Lenguaje de manipulación de datos XML (XML DML)

Otros recursos

Métodos de tipo de datos xml