Condividi tramite


Esempio: Specificare la direttiva HIDE

In questo esempio viene illustrato l'uso della direttiva HIDE . Questa direttiva è utile quando si desidera che la query restituisca un attributo per ordinare le righe nella tabella universale restituita dalla query, ma non si vuole che tale attributo nel documento XML risultante finale.

Questa query costruisce il codice XML seguente:

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

Questa query genera il codice XML desiderato. La query identifica due gruppi di colonne con 1 e 2 come valori tag nei nomi delle colonne.

Questa query usa il metodo query() (tipo di dati xml) del tipo di dati xml per eseguire una query sulla colonna CatalogDescription di tipo xml per recuperare la descrizione di riepilogo. La query usa anche il metodo value() (tipo di dati xml) del tipo di dati xml per recuperare il valore ProductModelID dalla colonna CatalogDescription. Questo valore non è obbligatorio nel codice XML risultante, ma è necessario per ordinare il set di righe risultante. Pertanto, il nome della colonna, [Summary!2!ProductModelID!HIDE], include la direttiva HIDE . Se questa colonna non è inclusa nell'istruzione SELECT, sarà necessario ordinare il set di righe in base a [ProductModel!1!ProdModelID] e [Summary!2!SummaryDescription], che è di tipo xml, e non è possibile utilizzare la colonna di tipo xml in ORDER BY. Pertanto, la colonna aggiuntiva [Summary!2!ProductModelID!HIDE] viene aggiunta e viene quindi specificata nella clausola 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  

Risultato:

<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>  

Vedere anche

Utilizzo della modalità EXPLICIT con FOR XML