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

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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.

Syntaxe

exist (XQuery)   

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

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

Notes

Notes

La méthode exist() retourne 1 pour l’expression de requête Xml 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()');   

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 entier 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 caster 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, elle est implicitement castée en type indiqué à droite de la comparaison, en l’occurrence le type xs:date.

  • Au lieu de caster en tant que xs:date() , vous pouvez utiliser la fonction constructeur xs:date() . Pour plus d’informations, consultez Fonctions constructeurs (requête Xml).

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 dans la requête précédente :

  • La méthode text() renvoie un nœud de texte qui contient la valeur non typée 2002-01-01. (Le type de requête Xml est xdt:untypedAtomic.) Vous devez explicitement caster cette valeur typée de x en xsd:date car le cast implicite n’est pas pris 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 contenant des instructions de fabrication est d’abord 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 contenant des instructions de fabrication comprend un élément <Location> avec 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 dans la requête précédente :

  • 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>. Remarquez l’utilisation de la fonction not() (requête Xml).

  • La sql:column() function (requête Xml) 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;  

Voir aussi

Ajouter des espaces de noms aux requêtes avec WITH XMLNAMESPACES
Comparer du XML typé et du XML non typé
Créer des instances de données XML
Méthodes de type de données xml
Langage de modification de données XML (XML DML)