Freigeben über


Beispiel: Spezifizieren der HIDE-Direktive

In diesem Beispiel wird die Verwendung der HIDE-Direktive veranschaulicht. Diese Direktive ist nützlich, wenn die Abfrage ein Attribut zurückgeben soll, um die Zeilen in der universellen Tabelle zu sortieren, die von der Abfrage zurückgegeben wird, aber Sie möchten dieses Attribut nicht im endgültigen resultierenden XML-Dokument.

Diese Abfrage erstellt diesen XML-Code:

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

Diese Abfrage generiert den gewünschten XML-Code. Die Abfrage identifiziert zwei Spaltengruppen mit 1 und 2 als Tag-Werte in den Spaltennamen.

Diese Abfrage verwendet die Query() -Methode (XML-Datentyp) des XML-Datentyps , um die CatalogDescription-Spalte des XML-Typs abzufragen, um die Zusammenfassungsbeschreibung abzurufen. Die Abfrage verwendet außerdem die Value() Method (xml Data Type) des XML-Datentyps , um den ProductModelID-Wert aus der Spalte "CatalogDescription" abzurufen. Dieser Wert ist im resultierenden XML-Code nicht erforderlich, ist jedoch erforderlich, um das resultierende Rowset zu sortieren. Daher enthält der Spaltenname [Summary!2!ProductModelID!HIDE]die HIDE-Direktive . Wenn diese Spalte nicht in der SELECT-Anweisung enthalten ist, müssen Sie das Rowset [ProductModel!1!ProdModelID][Summary!2!SummaryDescription] nach xml-Typ sortieren, und Sie können die XML-Typspalte in ORDER BY nicht verwenden. Daher wird die zusätzliche [Summary!2!ProductModelID!HIDE] Spalte hinzugefügt und dann in der ORDER BY-Klausel angegeben.

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  

Dies ist das Ergebnis:

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

Siehe auch

Verwenden des EXPLIZITEN Modus mit FOR XML