次の方法で共有


sql:key-fields を使用したキー列の識別 (SQLXML 4.0)

XSD スキーマに対して XPath クエリを指定する場合、ほとんどの場合、結果で適切な入れ子を取得するためにキー情報が必要です。 sql:key-fields注釈を指定することは、適切な階層が確実に生成されるようにする方法です。

適切な入れ子にするには、テーブルにマップする要素の sql:key-fields を指定することをお勧めします。 生成される XML は、基になる結果セットの順序に依存します。 sql:key-fieldsを指定しないと、生成された XML が正しく形成されない可能性があります。

sql:key-fieldsの値は、リレーションシップ内の行を一意に識別する列を識別します。 行を一意に識別するために複数の列が必要な場合、列の値はスペースで区切られます。

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

例示

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

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 クエリは、CustomerID が 3 未満のすべての <Order> 要素を返します。

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
        <sql:xpath-query mapping-schema="KeyFields1.xml">  
            /Order[@CustomerID < 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> を使用して指定された階層はありません。 スキーマでは、HumanResources.Employee テーブル内の従業員を一意に識別するために、 sql:key-fields 注釈を指定する必要があります。

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