Compartir a través de


Ejemplo: Especificar la directiva HIDE

En este ejemplo se muestra el uso de la directiva HIDE . Esta directiva es útil cuando desea que la consulta devuelva un atributo para ordenar las filas de la tabla universal devuelta por la consulta, pero no desea ese atributo en el documento XML resultante final.

Esta consulta construye este XML:

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

Esta consulta genera el XML que desea. La consulta identifica dos grupos de columnas que tienen 1 y 2 como valores de etiqueta en los nombres de columna.

Esta consulta usa el método query() (tipo de datos xml) del tipo de datos xml para consultar la columna CatalogDescription de tipo xml para recuperar la descripción de resumen. La consulta también usa el método value() (tipo de datos xml) del tipo de datos xml para recuperar el valor ProductModelID de la columna CatalogDescription. Este valor no es necesario en el XML resultante, pero es necesario para ordenar el conjunto de filas resultante. Por lo tanto, el nombre de columna, [Summary!2!ProductModelID!HIDE], incluye la directiva HIDE . Si esta columna no se incluye en la instrucción SELECT, tendrá que ordenar el conjunto de filas por [ProductModel!1!ProdModelID] y [Summary!2!SummaryDescription] ese es el tipo xml y no puede usar la columna de tipo xml en ORDER BY. Por lo tanto, se agrega la columna adicional [Summary!2!ProductModelID!HIDE] y, a continuación, se especifica en la cláusula 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  

El resultado es el siguiente:

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

Véase también

Usar el modo EXPLICIT con FOR XML