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.

Vous utilisez généralement cette méthode pour extraire une valeur d’une instance XML stockée dans une xml colonne de type, paramètre ou variable. 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.

S’applique à: SQL Server (SQL Server 2008 et version actuelle), Base de données Azure SQL.
  
value (XQuery, SQLType)  

XQuery
Est le XQuery expression, un 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. Sinon, une erreur est renvoyée.

SQLType
Type SQL préféré (littéral de chaîne) à retourner. Le type de retour de cette méthode correspond à la SQLType paramètre. SQLType ne peut pas être un xml type de données, un type common language runtime (CLR) défini par l’utilisateur, image, texte, ntext, ou sql_variant type de données. SQLType peut être un SQL, type de données défini par l’utilisateur.

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

System_CAPS_ICON_note.jpg Remarque


Pour des raisons de performances, au lieu d’utiliser le value() méthode dans un prédicat de comparaison avec une valeur relationnelle, utilisez exist() avec SQL :Column(). L'exemple D vous en donne l'illustration.

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 est spécifiée sur un xml colonne de type (CatalogDescription) dans le AdventureWorks base de données. 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             

Notez les points suivants dans 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 du value() (méthode) et le méthode exist() de la xml type de données. 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  

Notez les points suivants dans 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 la prologue XQuery, la déclaration d’espace de noms est utilisée pour définir le préfixe qui est utilisé ultérieurement dans le corps de la 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(). Par 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  

Ajoutez les espaces de noms pour les requêtes avec WITH XMLNAMESPACES
Comparer le type XML au format XML non typé
Créer des Instances de données XML
les méthodes de Type de données XML
XML Data Modification Language ( ; XML DML ) ;

Ajouts de la communauté

AJOUTER
Afficher: