Freigeben über


Beispiel: Angeben der ID- und der IDREFS-Direktive

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 <Customer>-Elements ist ein mehrwertiges Attribut, das auf die SalesOrderID-Attribute des < SalesOrder >-Elements verweist. Um diesen Link herzustellen, muss das SalesOrderID-Attribut als ID-Typ und das SalesOrderIDList-Attribut des < Customer>-Elements als IDREFS-Typ deklariert 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 AdventureWorks2008R2;
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;

Siehe auch

Verweis