Partager via


Exemple : spécification de la directive HIDE

Cet exemple illustre l’utilisation de la directive HIDE . Cette directive est utile lorsque vous souhaitez que la requête retourne un attribut pour classer les lignes dans la table universelle retournée par la requête, mais que vous ne souhaitez pas cet attribut dans le document XML final résultant.

Cette requête construit ce code XML :

<ProductModel ProdModelID="19" Name="Mountain-100">  
  <Summary>  
    <SummaryDescription>  
           <Summary> element from XML stored in CatalogDescription column  
    </SummaryDescription>  
  </Summary>  
</ProductModel>  

Cette requête génère le code XML souhaité. La requête identifie deux groupes de colonnes ayant 1 et 2 comme valeurs d’étiquette dans les noms de colonnes.

Cette requête utilise la méthode query() (type de données xml) du type de données xml pour interroger la colonne CatalogDescription de type xml afin de récupérer la description récapitulative. La requête utilise également la méthode value() (type de données xml) du type de données xml pour récupérer la valeur ProductModelID à partir de la colonne CatalogDescription. Cette valeur n’est pas obligatoire dans le code XML résultant, mais elle est nécessaire pour trier l’ensemble de lignes résultant. Par conséquent, le nom de colonne, [Summary!2!ProductModelID!HIDE]inclut la directive HIDE . Si cette colonne n’est pas incluse dans l’instruction SELECT, vous devez trier l’ensemble de lignes par [ProductModel!1!ProdModelID] et [Summary!2!SummaryDescription] c’est le type xml et vous ne pouvez pas utiliser la colonne de type xml dans ORDER BY. Par conséquent, la colonne supplémentaire [Summary!2!ProductModelID!HIDE] est ajoutée et est ensuite spécifiée dans la clause ORDER BY.

USE AdventureWorks2012;  
GO  
SELECT  1 as Tag,  
        0 as Parent,  
        ProductModelID     as [ProductModel!1!ProdModelID],  
        Name               as [ProductModel!1!Name],  
        NULL               as [Summary!2!ProductModelID!hide],  
        NULL               as [Summary!2!SummaryDescription]  
FROM    Production.ProductModel  
WHERE   CatalogDescription is not null  
UNION ALL  
SELECT  2 as Tag,  
        1 as Parent,  
        ProductModelID,  
        Name,  
        CatalogDescription.value('  
         declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       (/PD:ProductDescription/@ProductModelID)[1]', 'int'),  
        CatalogDescription.query('  
         declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
         /pd:ProductDescription/pd:Summary')  
FROM    Production.ProductModel  
WHERE   CatalogDescription is not null  
ORDER BY [ProductModel!1!ProdModelID],[Summary!2!ProductModelID!hide]  
FOR XML EXPLICIT  
go  

Voici le résultat obtenu :

<ProductModel ProdModelID="19" Name="Mountain-100">  
  <Summary>  
    <SummaryDescription>  
      <pd:Summary xmlns:pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription" xmlns="">  
        <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">Our top-of-the-line competition mountain bike. Performance-enhancing options include the innovative HL Frame, super-smooth front suspension, and traction for all terrain. </p1:p>  
      </pd:Summary>  
    </SummaryDescription>  
  </Summary>  
</ProductModel>  

Voir aussi

Utiliser le mode EXPLICIT avec FOR XML