次の方法で共有


sql:key-fields を使用した、キー列の指定 (XDR スキーマ)

ms172035.note(ja-jp,SQL.90).gif重要 :
このトピックは、レガシ アプリケーションの参照用として用意されています。この機能は今後更新されません。新しい開発作業では、この機能の使用を避け、注釈付き XSD スキーマを使用して XML ビューを作成してください。詳細については、「注釈付き XSD スキーマの概要 (SQLXML 4.0)」を参照してください。既存の注釈付き XDR スキーマは、XSD スキーマに変換できます。詳細については、「注釈付き XDR スキーマから同等の XSD スキーマへの変換 (SQLXML 4.0)」を参照してください。

XDR スキーマに対して XPath クエリを指定する場合、結果内に適切な入れ子を生成するには、多くの場合キー情報が必要です。sql:key-fields 注釈の指定は、適切な階層を確実に生成するための 1 つの方法です。

ms172035.note(ja-jp,SQL.90).gifメモ :
結果内に適切な入れ子を生成するには、すべてのスキーマで sql:key-fields を指定することをお勧めします。

多くの場合、適切な XML 階層を生成するには、テーブル内の行を一意に識別する方法を理解しておくことが必要です。<element> および <ElementType>sql:key-fields 注釈を追加し、テーブルの行を一意に識別する列を指定できます。

sql:key-fields の値で、<ElementType> に指定されたリレーションの行を一意に識別する列を指定します。1 つの行を一意に識別するために複数の列が必要な場合は、列値をスペースで区切って示します。

要素に子要素が含まれ、要素と子要素の間に <sql:relationship> が定義されていても、親要素に指定されているテーブルの主キーが <sql:relationship> で提供されない場合は、要素内に sql:key-fields 注釈を指定する必要があります。

次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。詳細については、「SQLXML のサンプル実行のための必要条件」を参照してください。

A. <sql:relationship> で十分な情報が提供されない場合に適切な入れ子を生成する

この例では、sql:key-fields をどこに指定すればよいかを示します。

次のスキーマを考えてみます。このスキーマでは、<Order> 要素と <Customer> 要素の間の階層が指定されており、<Order> 要素は親、<Customer> 要素は子となっています。

ここで、親と子のリレーションシップを指定するため、<sql:relationship> タグを使用します。<sql:relationship> タグでは、Sales.SalesOrderHeader テーブルの CustomerID を foreign-key として識別し、Sales.Customer テーブルの CustomerID キーを参照します。<sql:relationship> で提供されるこの情報だけでは、親テーブル (Sales.SalesOrderHeader) 内の行を一意に識別できません。このため、sql:key-fields を指定しないと、不正確な階層が生成されます。

<Order>sql:key-fields を指定すると、この注釈で親 (Sales.SalesOrderHeader テーブル) 内の行が一意に識別され、その子要素が親の下に表示されます。

スキーマは次のようになります。

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
        xmlns:dt="urn:schemas-microsoft-com:datatypes"
        xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <ElementType name="Customer" sql:relation="Sales.Customer">
    <AttributeType name="CustomerID" />
    <attribute type="CustomerID" />
  </ElementType>

  <ElementType name="Order" sql:relation="Sales.SalesOrderHeader" 
                            sql:key-fields="SalesOrderID" >
    <AttributeType name="SalesOrderID" />
    <AttributeType name="CustomerID" />
 
    <attribute type="SalesOrderID" />
    <attribute type="CustomerID" />
    <element type="Customer" >
             <sql:relationship
                         key-relation="Sales.SalesOrderHeader"
                         key="CustomerID"
                         foreign-relation="Sales.Customer"
                         foreign-key="CustomerID" />
    </element>
     </ElementType>
</Schema>

このスキーマの実際のサンプルをテストするには

  1. 上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、KeyFieldsA-Xdr.xml として保存します。

  2. 次のテンプレートをコピーして、テキスト ファイルに貼り付け、KeyFieldsA-Xdr.xml を保存したディレクトリに KeyFieldsA-XdrT.xml として保存します。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="KeyFieldsA-Xdr.xml">
        /Order
      </sql:xpath-query>
    </ROOT>
    

    マッピング スキーマ (KeyFieldsA-Xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。

    mapping-schema="C:\MyDir\KeyFieldsA-Xdr.xml"
    
  3. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

次に結果セットを示します。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order SalesOrderID="43659" CustomerID="676">
    <Customer CustomerID="676" /> 
  </Order>
  <Order SalesOrderID="43660" CustomerID="117">
    <Customer CustomerID="117" /> 
  </Order>
  <Order SalesOrderID="43661" CustomerID="442">
    <Customer CustomerID="442" /> 
  </Order>
  ...
</ROOT>

B. sql:key-fields を指定して結果内に適切な入れ子を生成する

このスキーマには、<sql:relationship> によって階層が指定されていませんが、sql:key-fields 注釈を指定して、HumanResources.Employee テーブルの従業員を一意に識別する必要があります。

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
   xmlns:dt="urn:schemas-microsoft-com:datatypes"
   xmlns:sql="urn:schemas-microsoft-com:xml-sql">
   <ElementType name="Title" content="textOnly"  >
      <AttributeType name="EmployeeID" />
      <attribute type="EmployeeID" />
   </ElementType>

   <ElementType name="HumanResources.Employee" sql:key-fields="EmployeeID" >
      <element type="Title" />
   </ElementType>
</Schema>

このスキーマの実際のサンプルをテストするには

  1. 上のスキーマのコードをコピーして、テキスト ファイルに貼り付け、KeyFieldsB-Xdr.xml として保存します。

  2. 次のテンプレートをコピーして、テキスト ファイルに貼り付け、KeyFieldsB-Xdr.xml を保存したディレクトリに KeyFieldsB-XdrT.xml として保存します。このテンプレートの XPath クエリでは、すべての <Order> 要素が返されます。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="KeyFieldsB-Xdr.xml">
        /HumanResources.Employee
      </sql:xpath-query>
    </ROOT>
    

    マッピング スキーマ (KeyFieldsB-Xdr.xml) に指定するディレクトリ パスは、テンプレートを保存するディレクトリに対する相対パスです。次のように、絶対パスを指定することもできます。

    mapping-schema="C:\MyDir\KeyFieldsB-Xdr.xml"
    
  3. SQLXML 4.0 テスト スクリプト (sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。

    詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

次に結果セットの一部を示します。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <HumanResources.Employee>
    <Title EmployeeID="1">Production Technician - WC60</Title> 
  </HumanResources.Employee>
  <HumanResources.Employee>
    <Title EmployeeID="2">Marketing Assistant</Title> 
  </HumanResources.Employee>
  <HumanResources.Employee>
    <Title EmployeeID="3">Engineering Manager</Title> 
  </HumanResources.Employee>
   ...
</ROOT>

参照

関連項目

SQLXML 4.0 での XPath クエリの使用

ヘルプおよび情報

SQL Server 2005 の参考資料の入手