Share via


クエリでの注釈付き XSD スキーマの使用 (SQLXML 4.0)

注釈付きスキーマに対してクエリを指定し、XSD スキーマに対してテンプレートで XPath クエリを指定して、データベースからデータを取得することができます。

注釈付きスキーマで定義されている XML ビューに対して XPath クエリを指定するには、<sql:xpath-query> 要素を使用します。<sql:xpath-query> 要素の mapping-schema 属性を使用して、XPath クエリの実行対象となる注釈付きスキーマを指定できます。

テンプレートは、1 つ以上のクエリを含む有効な XML ドキュメントです。FOR XML クエリと XPath クエリでは、ドキュメント フラグメントが返されますが、単一の最上位要素を指定するときにはテンプレートを使用できます。テンプレートは、ドキュメント フラグメントのコンテナとして機能します。

このトピックの例では、テンプレートを使用して注釈付きスキーマに対する XPath クエリを指定し、データベースからデータを取得します。

たとえば、次の注釈付きスキーマを考えてみます。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:element name="Person.Contact" >
     <xsd:complexType>
       <xsd:attribute name="ContactID" type="xsd:string" /> 
       <xsd:attribute name="FirstName" type="xsd:string" /> 
       <xsd:attribute name="LastName"  type="xsd:string" /> 
     </xsd:complexType>
  </xsd:element>
</xsd:schema>

わかりやすくするため、この XSD スキーマは Schema2.xml というファイルに格納されているものとします。ここで、次のテンプレート ファイル (Schema2T.xml) で指定されている注釈付きスキーマに対し、XPath クエリを指定できます。

<sql:xpath-query 
     xmlns:sql="urn:schemas-microsoft-com:xmlsql"
     >
          Person.Contact[@ContactID="1"]
</sql:xpath-query>

SQLXML 4.0 のテスト スクリプト (Sqlxml4test.vbs) を作成し、それを使用すると、テンプレート ファイルの一部としてクエリを実行できます。詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

インライン マッピング スキーマの使用

注釈付きスキーマはテンプレートに直接含めることができます。このテンプレートで、インライン スキーマに対する XPath クエリを指定できます。テンプレートはアップデートグラムとしても使用できます。

テンプレートには複数のインライン スキーマを含めることができます。テンプレートに含まれているインライン スキーマを使用するには、<xsd:schema> 要素に一意な値の id 属性を指定し、#idvalue を使用して、このインライン スキーマを参照します。id 属性は、XDR スキーマで使用される sql:id ({urn:schemas-microsoft-com:xml-sql}id) と同じ働きをします。詳細については、「クエリでの注釈付き XDR スキーマの使用 (SQLXML 4.0 では非推奨)」を参照してください。

たとえば、次のテンプレートでは、2 つのインライン注釈付きスキーマを指定しています。

<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'>
<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'
        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'
        id='InLineSchema1' sql:is-mapping-schema='1'>
  <xsd:element name='Employees' ms:relation='HumanResources.Employee'>
    <xsd:complexType>
      <xsd:attribute name='LoginID' 
                     type='xsd:string'/>
      <xsd:attribute name='Title' 
                     type='xsd:string'/>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'
        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'
        id='InLineSchema2' sql:is-mapping-schema='1'>
  <xsd:element name='Contacts' ms:relation='Person.Contact'>
    <xsd:complexType>

      <xsd:attribute name='ContactID' 
                     type='xsd:string' />
      <xsd:attribute name='FirstName' 
                     type='xsd:string' />
      <xsd:attribute name='LastName' 
                     type='xsd:string' />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

<sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql' 
        mapping-schema='#InLineSchema1'>
    /Employees[@LoginID='adventure-works\guy1']
</sql:xpath-query>

<sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql' 
        mapping-schema='#InLineSchema2'>
    /Contacts[@ContactID='1']
</sql:xpath-query>
</ROOT>

このテンプレートでは 2 つの XPath クエリも指定しています。それぞれの <xpath-query> 要素では、mapping-schema 属性により、マッピング スキーマが一意に識別されています。

テンプレートでインライン スキーマを指定する場合は、<xsd:schema> 要素に sql:is-mapping-schema 注釈も指定する必要があります。sql:is-mapping-schema はブール値 (0 = false、1=true) をとります。sql:is-mapping-schema="1" のインライン スキーマはインライン注釈付きスキーマとして扱われ、XML ドキュメント内には返されません。

sql:is-mapping-schema 注釈は、テンプレートの名前空間 urn:schemas-microsoft-com:xml-sql に属しています。

この例をテストするには、テンプレート (InlineSchemaTemplate.xml) をローカルのディレクトリに保存した後、SQLXML 4.0 テスト スクリプト (Sqlxml4test.vbs) を作成し、それを使用してテンプレートを実行します。詳細については、「ADO を使用した、SQLXML 4.0 クエリの実行」を参照してください。

mapping-schema 属性は、テンプレートの <sql:xpath-query> 要素 (XPath クエリがある場合) やアップデートグラムの <updg:sync> 要素で指定する方法の他に、次の方法で指定できます。

  • テンプレートの <ROOT> 要素 (グローバル宣言) で指定する。ここで指定したマッピング スキーマは、すべての XPath およびアップデートグラム ノードで、明示的に mapping-schema 注釈が指定されていない場合に既定のスキーマとして使用されます。
  • ADO Command オブジェクトを使用して指定する。

mapping-schema 属性は、<xpath-query> または <updg:sync> 要素で指定されたものが最も優先順位が高くなります。ADO Command オブジェクトで指定されたものは最も優先順位が低くなります。

テンプレートで XPath クエリを指定し、XPath クエリの実行対象となるマッピング スキーマを指定しない場合、XPath クエリは dbobject 型のクエリとして扱われる点に注意してください。たとえば、次のテンプレートを考えてみます。

<sql:xpath-query 
     xmlns:sql="urn:schemas-microsoft-com:xmlsql">
          Production.ProductPhoto[@ProductPhotoID='100']/@LargePhoto
</sql:xpath-query>

このテンプレートでは、XPath クエリが指定されていますが、マッピング スキーマが指定されていません。したがって、このクエリは dbobject 型のクエリとして扱われます。ここで、Production.ProductPhoto はテーブル名、@ProductPhotoID='100' は ID 値 100 の製品写真を検索する述語です。@LargePhoto は値の取得元の列です。