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

適用対象: SQL Server Azure SQL Database

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

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

テンプレートは、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) を作成し、それを使用すると、テンプレート ファイルの一部としてクエリを実行できます。 詳細については、「 Annotated XDR Schemas (SQLXML 4.0 で非推奨)を参照してください。

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

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

テンプレートには複数のインライン スキーマを含めることができます。 テンプレートに含まれるインライン スキーマを使用するには、<xsd:schema> 要素に一意の値を持つ id 属性を指定し、#idvalueを使用してインライン スキーマを参照します。 id 属性は、XDR スキーマで使用される sql:id ({urn:schemas-microsoft-com:xml-sql}id) と動作が同じです。

たとえば、次のテンプレートでは、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 属性を指定してマッピング スキーマを一意に識別します。

テンプレートでインライン スキーマを指定する場合は、 sql:is-mapping-schema 注釈も <xsd: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 クエリの実行」を参照してください。

テンプレート内の <sql:xpath-query> 要素にmapping-schema属性を指定するだけでなく (XPath クエリがある場合)、またはアップデートグラムの <updg:sync> 要素に対して、次の操作を行うことができます。

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

  • ADO Command オブジェクトを使用して、mapping スキーマ属性を指定します。

<xpath-query> または <updg:sync> 要素で指定される mapping-schema 属性の優先順位が最も高く、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 は、値を取得する列です。