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

适用于:SQL Server Azure SQL 数据库

通过在模板中针对 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) 以将此查询作为模板文件的一部分执行。 有关详细信息,请参阅带批注的 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 属性来唯一标识映射架构

在模板中指定内联架构时,还必须在 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> 元素上<,还可以执行以下操作:<

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

  • 使用 ADO Command 对象指定映射架构属性。

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