Fonctions de XQuery Extension - SQL :Column()XQuery Extension Functions - sql:column()

CETTE RUBRIQUE S’APPLIQUE À : ouiSQL Server (à partir de la version 2012)nonAzure SQL DatabasenonAzure SQL Data WarehousenonParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2012)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Comme décrit dans la rubrique de liaison de données relationnelles à l’intérieur de XML, vous pouvez utiliser la :Column() fonctionnent lorsque vous utilisez les méthodes de Type de données XML pour exposer une valeur relationnelle dans XQuery.As described in the topic, Binding Relational Data Inside XML, you can use the sql:column(() function when you use XML Data Type Methods to expose a relational value inside XQuery.

Par exemple, le méthode query() (type de données XML) est utilisée pour spécifier une requête sur une instance XML qui est stockée dans une variable ou une colonne de xml type.For example, the query() method (XML data type) is used to specify a query against an XML instance that is stored in a variable or column of xml type. 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.Sometimes, you may also want your query to use values from another, non-XML column, to bring relational and XML data together. Pour ce faire, vous utilisez la SQL :Column() (fonction).To do this, you use the sql:column() function.

La valeur SQL est alors mappée à sa valeur XQuery correspondante et son type à son type de base XQuery équivalent au type SQL.The SQL value will be mapped to a corresponding XQuery value and its type will be an XQuery base type that is equivalent to the corresponding SQL type.

SyntaxeSyntax


sql:column("columnName")  

NotesRemarks

Notez qu’une référence à une colonne spécifiée dans le SQL :Column() fonction à l’intérieur d’une requête XQuery fait référence à une colonne dans la ligne qui est en cours de traitement.Note that reference to a column specified in the sql:column() function inside an XQuery refers to a column in the row that is being processed.

Dans SQL ServerSQL Server, vous pouvez uniquement faire référence à un xml instruction d’insertion de l’instance dans le contexte de l’expression source d’un XML-DML ; sinon, vous ne peut pas faire référence aux colonnes de type xml ou un type défini par l’utilisateur CLR.In SQL ServerSQL Server, you can only refer to an xml instance in the context of the source expression of an XML-DML insert statement; otherwise, you cannot refer to columns that are of type xml or a CLR user-defined type.

Le SQL :Column() fonction n’est pas prise en charge dans les opérations de jointure.The sql:column() function is not supported in JOIN operations. Vous pouvez utiliser l'opération APPLY à la place.The APPLY operation can be used instead.

ExemplesExamples

A.A. Utilisation de sql:column() pour récupérer une valeur relationnelle dans du code XMLUsing sql:column() to retrieve the relational value inside XML

Concernant la construction XML, l'exemple suivant illustre la méthode à suivre pour récupérer des valeurs dans une colonne relationnelle non XML afin de lier les données XML et les données relationnelles.In constructing XML, the following example illustrates how you can retrieve values from a non-XML relational column to bind XML and relational data.

La requête construit du code XML se présentant sous la forme suivante :The query constructs XML that has the following form:

<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 :Note the following in the constructed XML:

  • Le ProductID, ProductName, et ProductPrice valeurs d’attribut sont obtenues à partir de la produit table.The ProductID, ProductName,and ProductPrice attribute values are obtained from the Product table.

  • Le ProductModelID valeur d’attribut est extraite de la ProductModel table.The ProductModelID attribute value is retrieved from the ProductModel table.

  • Pour rendre la requête plus intéressante, la ProductModelName valeur d’attribut est obtenue à partir de la CatalogDescription colonne de type xml.To make the query more interesting, the ProductModelName attribute value is obtained from the CatalogDescription column of xml type. 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.Because the XML product model catalog information is not stored for all the product models, the if statement is used to retrieve the value only if it exists.

    SELECT P.ProductID, CatalogDescription.query('  
    declare namespace pd="http://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 :Note the following from the previous query:

  • Les valeurs étant issues de deux tables différentes, la clause FROM doit mentionner ces deux tables.Because the values are retrieved from two different tables, the FROM clause specifies two 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.The condition in the WHERE clause filters the result and retrieves only products whose product models have catalog descriptions.

  • Le espace de noms mot clé dans le prologue XQuery définit le préfixe d’espace de noms XML, « pd », qui est utilisé dans le corps de la requête.The namespace keyword in the XQuery Prolog defines the XML namespace prefix, "pd", that is used in the query body. 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.Note that the table aliases, "P" and "PM", are defined in the FROM clause of the query itself.

  • Le SQL :Column() fonction est utilisée pour afficher des valeurs non-XML dans du code XML.The sql:column() function is used to bring non-XML values inside XML.

    Voici le résultat partiel :This is the partial result:

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.The following query constructs XML that contains product-specific information. 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.This information includes the ProductID, ProductName, ProductPrice, and, if available, the ProductModelName for all products that belong to a specific product model, ProductModelID=19. Le code XML est ensuite assigné à la @x variable de xml type.The XML is then assigned to the @x variable of xml type.

declare @x xml  
SELECT @x = CatalogDescription.query('  
declare namespace pd="http://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 aussiSee Also

Fonctions d’Extension XQuery SQL Server SQL Server XQuery Extension Functions
Comparer du XML typé et du XML non typé Compare Typed XML to Untyped XML
Données XML (SQL Server) XML Data (SQL Server)
Créer des instances de données XML Create Instances of XML Data
Méthodes des types de données xml xml Data Type Methods
XML Data Modification Language ( XML DML )XML Data Modification Language (XML DML)