Поделиться через


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

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

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

Предположим, что вы хотите создать XML, как показано в следующем примере:

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

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

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

Это запрос, который создает нужный XML-код. Запрос использует директивы ID и IDREFS для перезаписи типов в именах столбцов (SalesOrder!2!SalesOrderID!ID, Customer!1!SalesOrderIDList!IDREFS).

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;  

См. также

Использование режима EXPLICIT вместе с FOR XML