次の方法で共有


例: 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 句を使用する必要があります。 ORDER BYでは、IDREFS値を構成する行のシーケンスが、親要素の下にグループ化されていることを確認する必要があります。

これは、必要な XML を生成するクエリです。 このクエリでは、 ID ディレクティブと IDREFS ディレクティブを使用して、列名 (SalesOrder!2!SalesOrderID!IDCustomer!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;  

こちらもご覧ください

FOR XML で EXPLICIT モードを使用する