Méthode exist() (type de données xml)

Renvoie un bit qui représente l'une des conditions suivantes :

  • 1 : représente True, si l'expression XQuery dans une requête renvoie un résultat non vide. En d'autres termes, elle renvoie au moins un nœud XML.

  • 0 : représente False, si elle renvoie un résultat vide.

  • NULL si l'instance de type de données xml par rapport à laquelle la requête a été exécutée contient NULL.

Notes

La méthode exist() retourne 1 pour l'expression XQuery qui retourne un résultat non vide. Si vous spécifiez les fonctions true() ou false() au sein de la méthode exist(), la méthode exist() retourne 1, car les fonctions true() et false() retournent respectivement les valeurs booléennes True et False. De fait, elles retournent un résultat non vide. Par conséquent, la méthode exist() retourne 1 (True), comme l'illustre l'exemple suivant :

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

Syntaxe

exist (XQuery) 

Arguments

  • XQuery
    Expression XQuery, représentant un littéral de chaîne.

Exemples

Les exemples suivants montrent comment spécifier la méthode exist().

Exemple : Spécification de la méthode exist() par rapport à une variable de type xml

Dans l'exemple suivant, @x est une variable de type xml (xml non typé) et @f est une variable de type integer qui stocke la valeur renvoyée par la méthode exist(). La méthode exist() renvoie True (1) si la valeur de date stockée dans l'instance XML est 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

La comparaison des dates dans la méthode exist() fait ressortir les points suivants :

  • Le code cast as xs:date? permet de convertir la valeur en type xs:date à des fins de comparaison.

  • La valeur de l'attribut @Somedate est non typée. Lorsqu'elle est comparée, cette valeur est implicitement convertie dans le type indiqué à droite de la comparaison, en l'occurrence le type xs:date.

  • Au lieu de procéder à une conversion en tant que xs:date(), vous pouvez utiliser la fonction constructeur xs:date(). Pour plus d'informations, consultez Fonctions constructeur (XQuery).

L'exemple suivant est similaire au précédent, sauf qu'il possède un élément <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

Notez les points suivants par rapport à la requête ci-dessus :

  • La méthode text() renvoie un nœud de texte qui contient la valeur non typée 2002-01-01. (Le type XQuery est xdt:untypedAtomic.) Vous devez explicitement convertir cette valeur typée de x en xsd:date car la conversion implicite n'est pas prise en charge dans ce cas.

Exemple : Spécification de la méthode exist() par rapport à une variable xml typée

L'exemple suivant illustre l'utilisation de la méthode exist() par rapport à une variable de type xml. Il s'agit d'une variable XML typée, car elle spécifie le nom de la collection d'espaces de noms de schéma, ManuInstructionsSchemaCollection.

Dans l'exemple, un document d'instructions de fabrication est affecté à cette variable puis la méthode exist() est utilisée pour savoir si le document comprend un élément <Location> dont l'attribut LocationID a pour valeur 50.

La méthode exist() spécifiée par rapport à la variable @x renvoie 1 (True) si le document des instructions de fabrication comprend un élément <Location> ayant LocationID=50. Sinon, la méthode renvoie 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

Exemple : Spécification de la méthode exist() par rapport à une colonne de type xml

La requête suivante extrait les ID de modèle de produit dont les descriptions de catalogue ne comprennent pas les spécifications, en l'occurrence l'élément <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

Notez les points suivants par rapport à la requête ci-dessus :

  • La clause WHERE sélectionne uniquement les lignes de la table ProductDescription qui satisfont à la condition spécifiée par rapport à la colonne de type CatalogDescription xml.

  • La méthode exist() de la clause WHERE renvoie 1 (True) si le document XML ne comprend aucun élément <Specifications>. Notez l'utilisation de la fonction not() (XQuery).

  • La fonction sql:column() (XQuery) permet d'extraire la valeur d'une colonne non-XML.

  • Cette requête renvoie un ensemble de lignes vide.

La requête spécifie les méthodes query() et exist() du type de données xml et ces deux méthodes déclarent les mêmes espaces de noms dans le prologue de la requête. Dans ce cas, vous pouvez recourir à WITH XMLNAMESPACES pour déclarer le préfixe puis l'utiliser dans la requête.

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