例: ID ディレクティブと IDREFS ディレクティブを指定する
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
要素の属性は、 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 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;