Поделиться через


Пример: Указание директивы HIDE

В этом примере показано использование директивы HIDE . Эта директива полезна, если требуется, чтобы запрос возвращал атрибут для упорядочивания строк в универсальной таблице, возвращаемой запросом, но этот атрибут не требуется в итоговом XML-документе.

Этот запрос создает этот XML-код:

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

Этот запрос создает нужный XML-код. Запрос определяет две группы столбцов с 1 и 2 значениями тегов в именах столбцов.

Этот запрос использует метод query() (xml Data Type)типа данных XML для запроса столбца CatalogDescription типа XML для получения сводного описания. Запрос также использует метод value() (xml Data Type)типа данных XML для получения значения ProductModelID из столбца CatalogDescription. Это значение не требуется в результирующем XML- коде, но требуется для сортировки результирующего набора строк. Таким образом, имя [Summary!2!ProductModelID!HIDE]столбца включает директиву HIDE . Если этот столбец не включен в инструкцию SELECT, вам придется отсортировать набор строк по [ProductModel!1!ProdModelID] и [Summary!2!SummaryDescription], которые имеют тип xml, и вы не можете использовать столбец типа xml в ORDER BY. Поэтому добавляется дополнительный [Summary!2!ProductModelID!HIDE] столбец и затем указывается в предложении 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  

Результат:

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

См. также

Использование режима EXPLICIT вместе с FOR XML