次の方法で共有


sql:key-fields を使用した、キー列の指定 [SQLXML 4.0]

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

ms171857.note(ja-jp,SQL.90).gifメモ :
適切な入れ子を生成するには、テーブルにマップする要素に sql:key-fields を指定することをお勧めします。作成される XML は、基になる結果セットの順序指定に影響を受けます。sql:key-fields を指定しない場合、適切な XML が作成されない可能性があります。

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

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

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

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

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

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

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

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

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
  <xsd:appinfo>
    <sql:relationship name="OrdCust"
        parent="Sales.SalesOrderHeader"
        parent-key="CustomerID"
        child="Sales.Customer"
        child-key="CustomerID" />
  </xsd:appinfo>
</xsd:annotation>
  <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" 
               sql:key-fields="SalesOrderID">
   <xsd:complexType>
     <xsd:sequence>
     <xsd:element name="Customer" sql:relation="Sales.Customer" 
                       sql:relationship="OrdCust"  >
       <xsd:complexType>
         <xsd:attribute name="CustID" sql:field="CustomerID" />
         <xsd:attribute name="SoldBy" sql:field="SalesPersonID" />
       </xsd:complexType>
     </xsd:element>
     </xsd:sequence>
     <xsd:attribute name="SalesOrderID" type="xsd:integer" />
     <xsd:attribute name= "CustomerID" type="xsd:string" />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

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

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

  2. 次のテンプレートをコピーして、テキスト ファイルに貼り付け、KeyFields1.xml を保存したディレクトリに KeyFields1T.xml として保存します。このテンプレートの XPath クエリでは、3 より小さい CustomerID が指定されているすべての <Order> 要素が返されます。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
        <sql:xpath-query mapping-schema="KeyFields1.xml">
            /Order[@CustomerID &lt; 3]
        </sql:xpath-query>
    </ROOT>
    

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

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

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

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

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
    <Order SalesOrderID="43860" CustomerID="1">
       <Customer CustID="1" SoldBy="280"/>
    </Order>
    <Order SalesOrderID="44501" CustomerID="1">
       <Customer CustID="1" SoldBy="280"/>
    </Order>
    <Order SalesOrderID="45283" CustomerID="1">
       <Customer CustID="1" SoldBy="280"/>
    </Order>
    .....
</ROOT>

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

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

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="HumanResources.Employee" sql:key-fields="EmployeeID" >
   <xsd:complexType>
     <xsd:sequence>
        <xsd:element name="Title">
          <xsd:complexType>
            <xsd:simpleContent>
              <xsd:extension base="xsd:string">
                 <xsd:attribute name="EmployeeID" type="xsd:integer" />
              </xsd:extension>
            </xsd:simpleContent>
          </xsd:complexType>
        </xsd:element>
     </xsd:sequence>
   </xsd:complexType>
  </xsd:element>
</xsd:schema>

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

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

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

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

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

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

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

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

<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>