Fonction sql:variable() (XQuery)

Expose une variable qui contient une valeur relationnelle SQL dans une expression XQuery.

Syntaxe

sql:variable("variableName") as xdt:anyAtomicType?

Notes

Comme indiqué dans la rubrique Liaison de données relationnelles dans des données XML, cette fonction vous permet d'exposer une valeur relationnelle dans XQuery à l'aide des méthodes de type de données XML.

Par exemple, la méthode query() permet de spécifier une requête par rapport à une instance XML stockée dans une colonne ou variable de type de données xml. En outre, vous pouvez parfois souhaiter que la requête utilise des valeurs d'une variable ou d'un paramètre Transact-SQL afin de rassembler des données relationnelles et XML. Pour ce faire, vous utilisez la fonction sql:variable.

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

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 valeurs de type xml ou de type CLR (Common Language Runtime) défini par l'utilisateur.

Exemple

A. Utilisation de la fonction sql:variable() pour insérer une valeur variable Transact-SQL dans XML

L'exemple suivant construit une instance XML composée des éléments suivants :

  • une valeur (ProductID) issue d'une colonne non-XML. La fonction sql:column() permet de lier cette valeur au document XML ;

  • une valeur (ListPrice) issue d'une colonne non-XML d'une autre table. Là encore, sql:column() permet de lier cette valeur au document XML ;

  • une valeur (DiscountPrice) issue d'une variable Transact-SQL. La méthode sql:variable() permet de lier cette valeur au document XML ;

  • une valeur (ProductModelName) issue d'une colonne de type xml, pour rendre la requête plus intéressante.

Voici la requête :

DECLARE @price money

SET @price=2500.00
SELECT ProductID, Production.ProductModel.ProductModelID,CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";

       <Product 
           ProductID="{ sql:column("Production.Product.ProductID") }"
           ProductModelID= "{ sql:column("Production.Product.ProductModelID") }"
           ProductModelName="{/pd:ProductDescription[1]/@ProductModelName }"
           ListPrice="{ sql:column("Production.Product.ListPrice") }"
           DiscountPrice="{ sql:variable("@price") }"
        />') 
FROM Production.Product 
JOIN Production.ProductModel
ON Production.Product.ProductModelID = Production.ProductModel.ProductModelID
WHERE ProductID=771

Notez les points suivants par rapport à la requête ci-dessus :

  • La requête XQuery dans la méthode query() construit le document XML.

  • Le mot clé namespace permet de définir un préfixe d'espace de noms dans le prologue XQuery. Cette opération est réalisée car la valeur d'attribut ProductModelName est extraite de la colonne de type CatalogDescription xml, à laquelle un schéma est associé.

Voici le résultat obtenu :

<Product ProductID="771" ProductModelID="19" 
         ProductModelName="Mountain 100" 
         ListPrice="3399.99" DiscountPrice="2500" />