Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Атрибут элемента можно указать в качестве 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>
Атрибут SalesOrderIDList
Customer
<> элемента является многозначным атрибутом, который ссылается на 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;