Пример. Указание директив ID и IDREFS

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

Атрибут элемента может быть указан в качестве атрибута с типом ID , а атрибут IDREFS может быть использован для ссылки на него. Этим включаются связи внутри документа, которые похожи на связи первичного и внешнего ключей в реляционных базах данных.

Этот пример иллюстрирует, как директивы ID и IDREFS могут быть использованы для создания атрибутов с типами ID и IDREFS . Так как идентификаторы не могут быть целыми значениями, значения идентификаторов в этом примере преобразуются. Другими словами, они вводимы. Префиксы используются для значений ID.

Предположим, что требуется создать следующий XML:

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

Атрибут SalesOrderIDList элемента <Customer> является многозначным атрибутом, который ссылается на атрибут SalesOrderID элемента <SalesOrder>. Для установления этой связи атрибут SalesOrderID должен быть объявлен с типом ID, а атрибут SalesOrderIDList элемента <Customer> — с типом IDREFS. Так как заказчик может оставить несколько заказов, используется тип IDREFS .

Элементы типа IDREFS также имеют более одного значения. Поэтому следует использовать отдельные предложения выборки, которые будут повторно использовать одни и те же сведения столбцов тега, родителя и ключевого столбца. Предложение ORDER BY обеспечивает отображение последовательностей строк, определяющих значения IDREFS , сгруппированных по родительскому элементу.

Далее запрос, который создает желаемый XML. В запросе используются директивы ID и IDREFS для перезаписи типов в именах столбцов (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;

См. также