在查询中使用带批注的 XSD 架构 (SQLXML 4.0)

通过在模板中针对 XSD 架构指定 XPath 查询,可以针对带批注的架构指定查询以从数据库检索数据。

使用 <sql:xpath-query> 元素,您可以针对带批注的架构所定义的 XML 视图指定 XPath 查询。使用 <sql:xpath-query> 元素的 mapping-schema 属性来标识要针对哪个带批注的架构执行 XPath 查询。

模板是包含一个或多个查询的有效 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 查询。模板也可以是一个 updategram。

模板中可包含多个内联架构。若要使用模板中所包含的内联架构,请在 <xsd:schema> 元素中使用一个唯一值指定 id 属性,然后使用 #idvalue 引用该内联架构。id 属性的行为与 XDR 架构中使用的 sql:id ({urn:schemas-microsoft-com:xml-sql}id) 的行为相同。有关详细信息,请参阅在查询中使用带批注的 XDR 架构(不推荐在 SQLXML 4.0 中使用)

例如,下面的模板指定两个带批注的内联架构:

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

该模板还指定了两个 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 查询

除了在模板中对 <sql:xpath-query> 元素(存在 XPath 查询时)或在 updategram 中对 <updg:sync> 元素指定 mapping-schema 属性之外,还可以执行以下操作:

  • 在模板中对 <ROOT> 元素(全局声明)指定 mapping-schema 属性。这样,该映射架构就成为默认架构,并将由无显式 mapping-schema 批注的所有 XPath 和 updategram 节点使用。

  • 使用 ADO Command 对象指定 mapping schema 属性。

<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 为要从中检索值的列。