在查询中使用带批注的 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) 以将此查询作为模板文件的一部分执行。 有关详细信息,请参阅带批注的 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 是要从中检索值的列。