クエリでの注釈付き 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) を作成し、それを使用すると、テンプレート ファイルの一部としてクエリを実行できます。 詳細については、「注釈付き XDR スキーマ (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 属性により、マッピング スキーマが一意に識別されています。
テンプレートでインライン スキーマを指定する場合は、<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 は値の取得元の列です。