méthode value() (type de données xml)

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

Effectue une requête XQuery sur XML et retourne une valeur de type SQL. Cette méthode retourne une valeur scalaire.

Cette méthode est généralement utilisée pour extraire une valeur d’une instance XML stockée dans une colonne, une variable ou un paramètre de type xml. De cette façon, vous pouvez spécifier des SELECT requêtes qui combinent ou comparent des données XML avec des données dans des colonnes non XML.

Syntaxe

value ( XQuery , SQLType )

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 , littéral de chaîne, qui récupère les données à l’intérieur de l’instance XML. La requête XQuery doit retourner au plus une valeur. Dans le cas contraire, une erreur est retournée.

SQLType

Type SQL préféré, littéral de chaîne, à renvoyer. Le type de retour de cette méthode correspond au paramètre SQLType. SQLType ne peut pas être un type de données xml , un type CLR (Common Language Runtime) défini par l’utilisateur, une image, du texte, du ntext ou sql_variant type de données. SQLType peut être un type de données SQL défini par l’utilisateur.

La value() méthode utilise implicitement l’opérateur Transact-SQL CONVERT . value() tente de convertir le résultat de l’expression XQuery, la représentation sous forme de chaîne sérialisée, du type XSD (XML Schema Definition) au type SQL correspondant spécifié par la conversion Transact-SQL. Pour plus d’informations sur les règles de cast de type pour CONVERT, consultez CAST et CONVERT.

Pour des raisons de performances, vous pouvez utiliser avec sql:column() au lieu d’utiliser exist() la value() méthode dans un prédicat, pour comparer avec une valeur relationnelle. Cet exist() exemple est présenté plus loin dans cet article.

Exemples

Cet article requiert l'exemple de bases de données AdventureWorks2022, que vous pouvez télécharger à partir de la page d'accueil des exemples et projets de communautés Microsoft SQL Server.

A. Utiliser la méthode value() par rapport à une variable de type XML

Dans l’exemple suivant, une instance XML est stockée dans une variable de type xml . La méthode value() récupère la valeur d'attribut ProductID à partir du code XML. La valeur est ensuite affectée à une variable int .

DECLARE @myDoc XML;
DECLARE @ProdID INT;

SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>';

SET @ProdID = @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int');
SELECT @ProdID;

Une valeur de 1 est retournée en conséquence.

Bien qu’il n’existe qu’un seul ProductID attribut dans l’instance XML, les règles de saisie statique vous obligent à spécifier explicitement que l’expression de chemin d’accès retourne un singleton. Par conséquent, il [1] est ajouté à la fin de l’expression de chemin d’accès. Pour plus d’informations sur les types statiques, consultez Requête Xml et typage statique.

B. Utilisez la méthode value() pour récupérer une valeur à partir d’une colonne de type XML

La requête suivante porte sur une colonne de type xml (CatalogDescription) dans la base de données AdventureWorks2022. La requête récupère des valeurs d'attributs ProductModelID à partir de chaque instance XML stockée dans la colonne.

SELECT CatalogDescription.value(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
       (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
ORDER BY Result DESC;

Remarque de la requête précédente :

  • Le mot clé namespace est utilisé pour définir un préfixe d'espace de noms.

  • Conformément aux exigences de type statique, [1] est ajouté à la fin de l'expression de chemin d'accès dans la méthode value() afin d'indiquer de manière explicite que l'expression de chemin d'accès retourne un singleton.

Voici le résultat partiel :

35
34
...

C. Utilisez les méthodes value() et exist() pour récupérer des valeurs à partir d’une colonne de type XML

L’exemple suivant illustre l’utilisation de la méthode value() et de la méthode exist() du type de données xml. La méthode value() est utilisée pour récupérer des valeurs d'attributs ProductModelID à partir du code XML. La méthode exist() de la clause WHERE est utilisée pour filtrer les lignes de la table.

La requête récupère des ID de modèle de produit à partir d’instances XML qui incluent des informations de garantie (l’élément <Warranty>) comme caractéristiques. La condition de la clause WHERE utilise la méthode exist() pour récupérer uniquement les lignes qui satisfont cette condition.

SELECT CatalogDescription.value(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
           (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist(
    'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";

     /PD:ProductDescription/PD:Features/wm:Warranty') = 1;

Remarque de la requête précédente :

  • La colonne CatalogDescription est une colonne XML typée. Cela signifie qu'une collection de schémas lui est associée. Dans les modules et les prologs - XQuery Prolog, la déclaration d’espace de noms est utilisée pour définir le préfixe utilisé ultérieurement dans le corps de la requête.

  • Si la exist() méthode retourne 1 (true), elle indique que l’instance XML inclut l’élément <Warranty> enfant comme l’une des fonctionnalités.

  • La méthode value() de la clause SELECT récupère ensuite les valeurs d'attributs ProductModelID comme entiers.

Voici le résultat partiel :

19
23
...

D. Utilisez la méthode exist() au lieu de la méthode value()

Pour des raisons de performances, au lieu d'utiliser la méthode value() dans un prédicat pour comparer avec une valeur relationnelle, utilisez exist() avec sql:column(). Par exemple :

CREATE TABLE T (c1 INT, c2 VARCHAR(10), c3 XML);
GO

SELECT c1, c2, c3
FROM T
WHERE c3.value('(/root/@a)[1]', 'integer') = c1;
GO

Ce code peut être réécrit comme suit :

SELECT c1, c2, c3
FROM T
WHERE c3.exist('/root[@a=sql:column("c1")]') = 1;
GO