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

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

<sql:xpath-query> 元素允许针对由批注架构定义的 XML 视图指定 XPath 查询。 使用 mapping-schemasql:xpath-query 元素的属性标识要对其执行 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的文件中。 然后,可以针对以下模板文件中指定的带批注架构的 XPath 查询(Schema2T.xml):

<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 查询。 该模板也可以是 updategram。

模板可以包含多个内联架构。 若要使用模板中包含的内联架构,请在 xsd:schema> 元素上<指定具有唯一值的 ID 属性,然后使用 #idvalue 引用内联架构。 ID 属性的行为与 XDR 架构中使用的 sql:id({urn:schemas-microsoft-com:xml-sql}id)的行为相同。

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

<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 查询>元素通过指定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 元素的属性(如果有 XPath 查询>时),或在 updategram 中的 updg:sync> 元素上<,还可以执行以下作:mapping-schema

  • 在模板中指定 mapping-schemaROOT> 元素(全局声明)上的属性<。 然后,此映射架构将成为所有没有显式 mapping-schema 注释的 XPath 和 updategram 节点将使用的默认架构。

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

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