针对 XSD 架构指定 XPath 查询时,在大多数情况下,需要提供密钥信息才能获取结果中的正确嵌套。 指定 sql:key-fields 批注是确保生成适当层次结构的一种方式。
注释
为了确保正确嵌套,建议为映射到表的元素指定 sql:key-fields 。 生成的 XML 对基础结果集的顺序很敏感。 如果未 sql:key-fields 指定,则生成的 XML 可能无法正确形成。
sql:key-fields标识唯一标识关系中的行的列的值。 如果需要多个列来唯一标识行,则列值由空格分隔。
当元素包含元素与子元素之间定义的 sql:relationship> 时,必须使用批注,但不提供父元素中指定的表的主键。<sql:key-fields
例子
若要创建使用以下示例的工作示例,必须满足某些要求。 有关详细信息,请参阅 运行 SQLXML 示例的要求。
答: 当 sql:relationship> 不提供足够的信息时<生成适当的嵌套
此示例显示必须指定的位置 sql:key-fields 。
请考虑以下架构。 架构指定 Order> 元素和 Customer 元素之间的<层次结构,<其中 Order> 元素是父元素,<Customer> 元素是子元素。><
<sql:relationship> 标记用于指定父子关系。 它将 Sales.SalesOrderHeader 表中的 CustomerID 标识为引用 Sales.Customer 表中 CustomerID 子密钥的父键。
sql:relationship> 中<提供的信息不足以唯一标识父表中的行(Sales.SalesOrderHeader)。 因此,如果没有 sql:key-fields 批注,生成的层次结构是不准确的。
在 sql:key-fieldsOrder> 上<指定时,批注唯一标识父级(Sales.SalesOrderHeader 表)中的行,其子元素显示在父元素下方。
这是架构:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="OrdCust"
parent="Sales.SalesOrderHeader"
parent-key="CustomerID"
child="Sales.Customer"
child-key="CustomerID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"
sql:key-fields="SalesOrderID">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Customer" sql:relation="Sales.Customer"
sql:relationship="OrdCust" >
<xsd:complexType>
<xsd:attribute name="CustID" sql:field="CustomerID" />
<xsd:attribute name="SoldBy" sql:field="SalesPersonID" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name= "CustomerID" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
创建此架构的工作示例
复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 KeyFields1.xml。
复制以下模板,并将它粘贴到文本文件中。 将文件另存为 KeyFields1T.xml 保存在保存 KeyFields1.xml的同一目录中。 模板中的 XPath 查询返回 CustomerID 小于 3 的所有 <Order> 元素。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFields1.xml"> /Order[@CustomerID < 3] </sql:xpath-query> </ROOT>为映射架构(KeyFields1.xml)指定的目录路径相对于保存模板的目录。 也可以指定绝对路径,例如:
mapping-schema="C:\MyDir\KeyFields1.xml"创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅 使用 ADO 执行 SQLXML 查询。
这是部分结果集:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43860" CustomerID="1">
<Customer CustID="1" SoldBy="280"/>
</Order>
<Order SalesOrderID="44501" CustomerID="1">
<Customer CustID="1" SoldBy="280"/>
</Order>
<Order SalesOrderID="45283" CustomerID="1">
<Customer CustID="1" SoldBy="280"/>
</Order>
.....
</ROOT>
B. 指定 sql:key-fields 以在结果中生成正确的嵌套
在以下架构中,没有使用 <sql:relationship> 指定的层次结构。 架构仍需要指定 sql:key-fields 批注以唯一标识 HumanResources.Employee 表中的员工。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="HumanResources.Employee" sql:key-fields="EmployeeID" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Title">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="EmployeeID" type="xsd:integer" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
创建此架构的工作示例
复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 KeyFields2.xml。
复制以下模板,并将它粘贴到文本文件中。 将文件另存为 KeyFields2T.xml 保存在保存 KeyFields2.xml的同一目录中。 模板中的 XPath 查询返回所有 <HumanResources.Employee> 元素:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFields2.xml"> /HumanResources.Employee </sql:xpath-query> </ROOT>为映射架构(KeyFields2.xml)指定的目录路径相对于保存模板的目录。 也可以指定绝对路径,例如:
mapping-schema="C:\MyDir\KeyFields2.xml"创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅 使用 ADO 执行 SQLXML 查询。
结果如下:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<HumanResources.Employee>
<Title EmployeeID="1">Production Technician - WC60</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title EmployeeID="2">Marketing Assistant</Title>
</HumanResources.Employee>
<HumanResources.Employee>
<Title EmployeeID="3">Engineering Manager</Title>
</HumanResources.Employee>
...
</ROOT>