Fonctions d’extension XQuery : sql:column()

S’applique à :SQL Server

Comme décrit dans la rubrique Liaison de données relationnelles dans XML, vous pouvez utiliser la fonction sql:column(() lorsque vous utilisez des méthodes de type de données XML pour exposer une valeur relationnelle à l’intérieur de XQuery.

Par exemple, la méthode query() (type de données XML) est utilisée pour spécifier une requête sur une instance XML stockée dans une variable ou une colonne de type xml . Il se peut également que vous vouliez que votre requête utilise des valeurs provenant d'une autre colonne non XML, afin de regrouper des données relationnelles et des données XML. Pour ce faire, vous utilisez la fonction sql:column().

La valeur SQL sera mappée à une valeur XQuery correspondante et son type sera un type de base XQuery équivalent au type SQL correspondant.

Syntaxe

  
sql:column("columnName")  

Notes

Notez que la référence à une colonne spécifiée dans la fonction sql:column() à l’intérieur d’une XQuery fait référence à une colonne de la ligne en cours de traitement.

Dans SQL Server, vous pouvez uniquement faire référence à une instance xml dans le contexte de l’expression source d’une instruction d’insertion XML-DML ; sinon, vous ne pouvez pas faire référence à des colonnes de type xml ou CLR défini par l’utilisateur.

La fonction sql:column() n’est pas prise en charge dans les opérations JOIN. Vous pouvez utiliser l'opération APPLY à la place.

Exemples

R. Utilisation de sql:column() pour récupérer une valeur relationnelle dans du code XML

Dans la construction de XML, l’exemple suivant montre comment récupérer des valeurs à partir d’une colonne relationnelle non XML pour lier des données XML et relationnelles.

La requête construit du code XML se présentant sous la forme suivante :

<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"   
  ProductModelName="Mountain 100" />  

Il est à noter les points suivants dans le code XML ainsi construit :

  • Les valeurs d’attribut ProductID, ProductName et ProductPrice sont obtenues à partir de la table Product .

  • La valeur de l’attribut ProductModelID est récupérée à partir de la table ProductModel .

  • Pour rendre la requête plus intéressante, la valeur de l’attribut ProductModelName est obtenue à partir de la colonne CatalogDescription de type xml. Comme les informations du catalogue de modèles de produits XML ne sont pas stockées pour tous les modèles de produits, l'instruction if ne permet de récupérer la valeur que si elle existe.

    SELECT P.ProductID, CatalogDescription.query('  
    declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           <Product   
               ProductID=       "{ sql:column("P.ProductID") }"  
               ProductName=     "{ sql:column("P.Name") }"  
               ProductPrice=    "{ sql:column("P.ListPrice") }"  
               ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
               { if (not(empty(/pd:ProductDescription))) then  
                 attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
                else   
                   ()  
    }  
            </Product>  
    ') as Result  
    FROM Production.ProductModel PM, Production.Product P  
    WHERE PM.ProductModelID = P.ProductModelID  
    AND   CatalogDescription is not NULL  
    ORDER By PM.ProductModelID  
    

Notez les points suivants dans la requête précédente :

  • Les valeurs étant issues de deux tables différentes, la clause FROM doit mentionner ces deux tables. La condition stipulée dans la clause WHERE filtre le résultat et ne récupère ainsi que les produits dont les modèles disposent d'une description mentionnée dans le catalogue.

  • Le mot clé d’espace de noms dans le Prolog XQuery définit le préfixe d’espace de noms XML, « pd », qui est utilisé dans le corps de la requête. Il reste à noter que les alias de table, à savoir « P » et « PM », sont définis dans la clause FROM de la requête même.

  • La fonction sql:column() est utilisée pour importer des valeurs non XML dans XML.

Voici le résultat partiel :

ProductID               Result  
-----------------------------------------------------------------  
771         <Product ProductID="771"                   ProductName="Mountain-100 Silver, 38"   
                  ProductPrice="3399.99" ProductModelID="19"   
                  ProductModelName="Mountain 100" />  
...  

La requête suivante construit du code XML contenant des informations spécifiques à chaque produit. Ces informations comprennent les colonnes ProductID (correspondant à l'identificateur du produit), ProductName (le nom du produit), ProductPrice (son prix) et le cas échéant, ProductModelName (le nom de son modèle) pour les produits appartenant à un modèle donné ; dans le cas présenté ci-dessous, ProductModelID = 19. Le code XML est ensuite affecté à la @x variable de type xml .

declare @x xml  
SELECT @x = CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <Product   
           ProductID=       "{ sql:column("P.ProductID") }"  
           ProductName=     "{ sql:column("P.Name") }"  
           ProductPrice=    "{ sql:column("P.ListPrice") }"  
           ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
           { if (not(empty(/pd:ProductDescription))) then  
             attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
            else   
               ()  
}  
        </Product>  
')   
FROM Production.ProductModel PM, Production.Product P  
WHERE PM.ProductModelID = P.ProductModelID  
And P.ProductModelID = 19  
select @x  

Voir aussi

Fonctions d'extension SQL Server XQuery
Comparer du XML typé et du XML non typé
Données XML (SQL Server)
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)