要素属性は ID
型属性として指定でき、 IDREFS
属性を使用して参照できます。 これにより、ドキュメント内リンクが有効になり、リレーショナル データベースの主キーと外部キーのリレーションシップに似ています。
この例では、 ID
ディレクティブと IDREFS
ディレクティブを使用して、 ID
型と IDREFS
型の属性を作成する方法を示します。 ID は整数値にできないため、この例の ID 値は変換されます。 つまり、型変換されるのです。 ID 値にはプレフィックスが使用されます。
次に示すように XML を構築するとします。
<Customer CustomerID="C1" SalesOrderIDList=" O11 O22 O33..." >
<SalesOrder SalesOrderID="O11" OrderDate="..." />
<SalesOrder SalesOrderID="O22" OrderDate="..." />
<SalesOrder SalesOrderID="O33" OrderDate="..." />
...
</Customer>
<
Customer
>要素のSalesOrderIDList
属性は、<SalesOrder
>要素のSalesOrderID
属性を参照する複数値属性です。 このリンクを確立するには、SalesOrderID
属性をID
型で宣言し、<Customer
>要素のSalesOrderIDList
属性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;