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

適用対象: SQL Server Azure SQL Database

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

Note

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

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

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

次の例を使用した実際のサンプルを作成するには、特定の条件を満たす必要があります。 詳細については、「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 注釈がないと、生成される階層は不正確になります。

sql:key-fields <Order> で指定すると、注釈は親 (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>