value(), méthode (Type de données xml)

Exécute une requête XQuery sur le code 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. Vous pouvez ainsi spécifier des requêtes SELECT qui combinent ou comparent des données XML avec des données de colonnes non-XML.

Syntaxe

value (XQuery, SQLType)

Arguments

  • XQuery
    Expression XQuery (littéral de chaîne) qui récupère des 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) à retourner. 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, ni un type de données image, text, ntext ou sql_variant. SQLType peut être un type de données SQL défini par l'utilisateur.

La méthode value() utilise l'opérateur Transact-SQL CONVERT de manière implicite et essaie de convertir le résultat de l'expression XQuery, la représentation de chaîne sérialisée, du type XSD au type SQL correspondant spécifié par la conversion Transact-SQL. Pour plus d'informations sur les règles de casting de type pour CONVERT, consultez CAST et CONVERT (Transact-SQL).

ms178030.note(fr-fr,SQL.90).gifRemarque :
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(). L'exemple D vous en donne l'illustration.

Exemples

A. Utilisation de la méthode value() sur 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 assigné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

La valeur 1 est retournée comme résultat.

Bien qu'il n'y ait qu'un seul attribut ProductID dans l'instance XML, les règles de types statiques exigent que vous spécifiiez de manière explicite que l'expression de chemin d'accès retourne un singleton. Par conséquent, le [1] supplémentaire est spécifié à la fin de l'expression de chemin d'accès. Pour plus d'informations sur les types statiques, consultez XQuery et le typage statique.

B. Utilisation de 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 AdventureWorks. 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="https://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           

Notez les éléments suivants relatifs à 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. Utilisation des 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="https://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="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";

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

Notez les éléments suivants relatifs à 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 le prologue XQuery, la déclaration d'espace de noms permet de définir le préfixe utilisé ultérieurement dans le corps de requête.
  • Si la méthode exist() retourne un 1 (True), cela indique que l'instance XML contient l'élément enfant <Warranty> comme caractéristique.
  • La méthode value() de la clause SELECT récupère ensuite les valeurs d'attributs ProductModelID comme entiers.

Voici le résultat partiel :

Result     
-----------
19         
23         
...

D. Utilisation de 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(). Exemple :

CREATE TABLE T (c1 int, c2 varchar(10), c3 xml)
GO

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

Cela peut être écrit de la manière suivante :

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

Voir aussi

Concepts

Ajout d'espaces de noms à l'aide de WITH XMLNAMESPACES
XML typé et non typé
Type de données xml
Génération d'instances XML
Langage de modification de données XML (XML DML)
Exemples d'applications XML

Autres ressources

Méthodes des types de données xml

Aide et Informations

Assistance sur SQL Server 2005