Пример. Задание директив ID и IDREFS
Атрибут элемента может быть указан в качестве типа атрибута ID, а атрибут IDREFS может быть использован для ссылки на него. Этим включаются связи внутри документа, которые похожи на связи первичного и внешнего ключей в реляционных базах данных.
Этот пример иллюстрирует, как директивы ID и IDREFS могут быть использованы для создания атрибутов с типами ID и IDREFS. Так как идентификаторы не могут быть целочисленными, значения ID в этом примере преобразуются. Другими словами, они подвергаются приведению типа. Префиксы используются для значений 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).
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 C, Sales.SalesOrderHeader SOH
WHERE 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 C, Sales.SalesOrderHeader SOH
WHERE C.CustomerID = SOH.CustomerID
ORDER BY [Customer!1!CustomerID] ,
[SalesOrder!2!SalesOrderID!ID],
[Customer!1!SalesOrderIDList!IDREFS]
FOR XML EXPLICIT