Udostępnij za pomocą


Przykład: Określ dyrektywy ID i IDREFS

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Atrybut elementu można określić jako atrybut typu identyfikatora , a atrybut IDREFS może następnie służyć do odwoływania się do niego. Umożliwia to tworzenie linków wewnątrz dokumentów i jest podobne do relacji klucza podstawowego i klucza obcego w relacyjnych bazach danych.

W tym przykładzie pokazano, jak można używać dyrektyw ID i IDREFS do tworzenia atrybutów typów ID i IDREFS . Ponieważ identyfikatory nie mogą być wartościami całkowitymi, wartości identyfikatorów w tym przykładzie są konwertowane. Innymi słowy, są rzutowane. Prefiksy są używane dla wartości identyfikatorów.

Załóżmy, że chcesz skonstruować kod XML, jak pokazano poniżej:

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

Atrybut SalesOrderIDList<Customer> elementu jest atrybutem wielowartościowym, który odwołuje się do SalesOrderID atrybutu <SalesOrder> elementu. Aby ustanowić ten link, SalesOrderID atrybut musi być zadeklarowany typu ID , a SalesOrderIDList atrybut <Customer> elementu musi być zadeklarowany jako IDREFS typ. Ponieważ klient może zażądać kilku zamówień, używa się typu IDREFS.

Elementy typu IDREFS mają również więcej niż jedną wartość. W związku z tym należy użyć oddzielnej klauzuli select, która ponownie wykorzysta ten sam tag, element nadrzędny i informacje kolumn klucza. ORDER BY Następnie należy upewnić się, że sekwencja wierszy tworzących wartości IDREFS jest pogrupowana razem w ramach ich elementu nadrzędnego.

Jest to zapytanie, które generuje odpowiedni kod XML. Zapytanie używa dyrektyw ID i IDREFS do nadpisywania typów w nazwach kolumn (SalesOrder!2!SalesOrderID!ID, Customer!1!SalesOrderIDList!IDREFS).

USE AdventureWorks2022;
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.CustomerID
ORDER BY [Customer!1!CustomerID] ,
         [SalesOrder!2!SalesOrderID!ID],
         [Customer!1!SalesOrderIDList!IDREFS]
FOR XML EXPLICIT;

Zobacz także