例 : ID ディレクティブと IDREFS ディレクティブの指定

要素の属性は、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 句を使用して、同じタグ、親、およびキー列の情報を再利用する必要があります。さらに、IDREFS 値を構成する一連の行が、それぞれの親要素の直後にグループ化された状態で表示されるように、ORDER BY 句を指定します。

求める 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

関連項目

参照