例: ID ディレクティブと IDREF ディレクティブを指定する

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

この例は、「ELEMENTXSINIL ディレクティブの指定」の例とほぼ同じです。 クエリで ID ディレクティブと IDREF ディレクティブを指定している点のみが異なります。 これらのディレクティブは、<OrderHeader> 要素と <OrderDetail> 要素の SalesPersonID 属性の型を上書きし、ドキュメント内リンクを形成します。 上書きされた型を確認するには、スキーマが必要です。 そのため、このクエリでは、FOR XML 句に XMLDATA オプションを指定して、スキーマを取得しています。

USE AdventureWorks2022;
GO
SELECT  1 as Tag,
        0 as Parent,
        SalesOrderID  as [OrderHeader!1!SalesOrderID!id],
        OrderDate     as [OrderHeader!1!OrderDate],
        CustomerID    as [OrderHeader!1!CustomerID],
        NULL          as [SalesPerson!2!SalesPersonID],
        NULL          as [OrderDetail!3!SalesOrderID!idref],
        NULL          as [OrderDetail!3!LineTotal],
        NULL          as [OrderDetail!3!ProductID],
        NULL          as [OrderDetail!3!OrderQty]
FROM   Sales.SalesOrderHeader
WHERE  SalesOrderID IN (43659, 43661)

UNION ALL
SELECT 2 as Tag,
       1 as Parent,
        SalesOrderID,
        NULL,
        NULL,
        SalesPersonID,
        NULL,
        NULL,
        NULL,
        NULL
FROM   Sales.SalesOrderHeader
WHERE  SalesOrderID IN (43659, 43661)

UNION ALL
SELECT 3 as Tag,
       1 as Parent,
        SOD.SalesOrderID,
        NULL,
        NULL,
        SalesPersonID,
        SOH.SalesOrderID,
        LineTotal,
        ProductID,
        OrderQty
FROM    Sales.SalesOrderHeader SOH,
        Sales.SalesOrderDetail SOD
WHERE   SOH.SalesOrderID = SOD.SalesOrderID
AND     (SOH.SalesOrderID=43659 or SOH.SalesOrderID=43661)
ORDER BY [OrderHeader!1!SalesOrderID!id],
         [SalesPerson!2!SalesPersonID],
         [OrderDetail!3!SalesOrderID!idref],
         [OrderDetail!3!LineTotal]

FOR XML EXPLICIT, XMLDATA;

次に結果の一部を示します。 スキーマでは、ID ディレクティブと IDREF ディレクティブにより、<OrderHeader> 要素と <OrderDetail> 要素の SalesOrderID 属性のデータ型が上書きされています。 これらのディレクティブを削除すると、スキーマはこれらの属性の元の型を返します。

<Schema
       name="Schema1"
       xmlns="urn:schemas-microsoft-com:xml-data"
       xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <ElementType name="OrderHeader" content="mixed" model="open">
    <AttributeType name="SalesOrderID" dt:type="id" />
    <AttributeType name="OrderDate" dt:type="dateTime" />
    <AttributeType name="CustomerID" dt:type="i4" />
    <attribute type="SalesOrderID" />
    <attribute type="OrderDate" />
    <attribute type="CustomerID" />
  </ElementType>
  <ElementType name="SalesPerson" content="mixed" model="open">
    <AttributeType name="SalesPersonID" dt:type="i4" />
    <attribute type="SalesPersonID" />
  </ElementType>
  <ElementType name="OrderDetail" content="mixed" model="open">
    <AttributeType name="SalesOrderID" dt:type="idref" />
    <AttributeType name="LineTotal" dt:type="number" />
    <AttributeType name="ProductID" dt:type="i4" />
    <AttributeType name="OrderQty" dt:type="i2" />
    <attribute type="SalesOrderID" />
    <attribute type="LineTotal" />
    <attribute type="ProductID" />
    <attribute type="OrderQty" />
  </ElementType>
</Schema>
<OrderHeader
       xmlns="x-schema:#Schema1"
       SalesOrderID="43659"
       OrderDate="2001-07-01T00:00:00"
       CustomerID="676">
  <SalesPerson SalesPersonID="279" />
  <OrderDetail
         SalesOrderID="43659"
         LineTotal="10.373000"
         ProductID="712"
         OrderQty="2" />
  ...
</OrderHeader>
...

関連項目