Freigeben über


Beispiel: Angeben der ID- und IDREFS-Anweisungen

Ein Elementattribut kann als Attribut vom Typ ID angegeben werden, wobei das IDREFS-Attribut dann verwendet werden kann, um darauf zu verweisen. Dies ermöglicht dokumentinterne Links. Das Verfahren ist der Beziehung zwischen Primärschlüssel und Fremdschlüssel in relationalen Datenbanken ähnlich.

Dieses Beispiel veranschaulicht, wie die ID- und die IDREFS-Direktive zum Erstellen von Attributen vom Typ ID und IDREFS verwendet werden können. Da IDs keine ganzzahligen Werte sein können, werden die ID-Werte in diesem Beispiel konvertiert, d. h. sie werden einer Typumwandlung unterzogen, und es werden Präfixe für die ID-Werte verwendet.

Angenommen, Sie möchten folgende XML-Ausgabe generieren:

<Customer CustomerID="C1" SalesOrderIDList=" O11 O22 O33..." >  
    <SalesOrder SalesOrderID="O11" OrderDate="..." />  
    <SalesOrder SalesOrderID="O22" OrderDate="..." />  
    <SalesOrder SalesOrderID="O33" OrderDate="..." />  
    ...  
</Customer>  

Das SalesOrderIDList Attribut des <>CustomerElements ist ein mehrwertiges Attribut, das auf das SalesOrderID Attribut des <SalesOrder> Elements verweist. Um diesen Link herzustellen, muss das SalesOrderID Attribut vom ID Typ deklariert werden, und das SalesOrderIDList Attribut des><CustomerElements muss vom Typ deklariert IDREFS werden. Da ein Kunde mehrere Bestellungen aufgeben kann, wird IDREFS verwendet.

Elemente des IDREFS-Typs können zudem mehr als einen Wert annehmen. Daher müssen Sie jeweils eine SELECT-Klausel verwenden, die dieselben Tag-, Parent- und Schlüsselspalteninformationen wiederverwendet. Mit ORDER BY stellen Sie dann sicher, dass die Zeilensequenz, aus der die IDREFS-Werte bestehen, unter dem jeweiligen übergeordneten Element gruppiert wird.

Im Folgenden wird die Abfrage gezeigt, die die gewünschte XML-Ausgabe erstellt. Die Abfrage verwendet die ID -Direktive und die IDREFS -Direktive, um die Datentypen der Spaltennamen (SalesOrder!2!SalesOrderID!ID, Customer!1!SalesOrderIDList!IDREFS) zu überschreiben.

USE AdventureWorks2012;  
GO  
SELECT  1 as Tag,  
        0 as Parent,  
        C.CustomerID       [Customer!1!CustomerID],  
        NULL               [Customer!1!SalesOrderIDList!IDREFS],  
        NULL               [SalesOrder!2!SalesOrderID!ID],  
        NULL               [SalesOrder!2!OrderDate]  
FROM   Sales.Customer C   
UNION ALL   
SELECT  1 as Tag,  
        0 as Parent,  
        C.CustomerID,  
        'O-'+CAST(SalesOrderID as varchar(10)),   
        NULL,  
        NULL  
FROM   Sales.Customer AS C  
INNER JOIN Sales.SalesOrderHeader AS SOH  
    ON  C.CustomerID = SOH.CustomerID  
UNION ALL  
SELECT 2 as Tag,  
       1 as Parent,  
        C.CustomerID,  
        NULL,  
        'O-'+CAST(SalesOrderID as varchar(10)),  
        OrderDate  
FROM   Sales.Customer AS C  
INNER JOIN Sales.SalesOrderHeader AS SOH  
    ON  C.CustomerID = SOH.CustomerIDORDER BY [Customer!1!CustomerID] ,  
         [SalesOrder!2!SalesOrderID!ID],  
         [Customer!1!SalesOrderIDList!IDREFS]  
FOR XML EXPLICIT;  

Weitere Informationen

Verwenden des EXPLICIT-Modus mit FOR XML