在查询中使用带批注的 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 为要从中检索值的列。