使用 sql:key-fields 标识键列(XDR 架构)
重要提示 |
---|
本主题是针对早期应用程序提供的参考。以后不会就该功能继续进行开发。请避免在新的开发工作中使用此功能。请改用带批注的 XSD 架构创建 XML 视图。有关详细信息,请参阅带批注的 XSD 架构简介 (SQLXML 4.0)。可以将现有带批注的 XDR 架构转换为 XSD 架构。有关详细信息,请参阅将带批注的 XDR 架构转换为等效的 XSD 架构 (SQLXML 4.0)。 |
针对 XDR 架构指定 XPath 查询时,大多数情况下需要键信息以在结果中获得正确的嵌套。指定 sql:key-fields 批注是一种确保生成适当层次结构的方式。
注意 |
---|
若要在结果中生成正确的嵌套,建议在所有架构中指定 sql:key-fields。 |
在许多情况下,必须了解如何唯一标识表中的行,才能生成适当的 XML 层次结构。可以在 <element> 和 <ElementType> 中添加 sql:key-fields 批注,以标识唯一标识表中行的列。
sql:key-fields 的值用于标识列,该列可唯一标识 <ElementType> 中所指定关系中的行。如果需要多列才能唯一标识行,则多个列值用空格分隔列出。
必须在包含子元素、与子元素之间定义了 <sql:relationship> 且子元素中未提供表的主键(在父元素中指定)的元素中指定 sql:key-fields 批注。
示例
若要创建使用以下示例的工作示例,必须满足一些要求。有关详细信息,请参阅运行 SQLXML 示例的要求。
A. 在 <sql:relationship> 未提供足够信息的情况下生成适当的嵌套
该示例显示必须指定 sql:key-fields 的地方。
请考虑以下架构。该架构指定了 <Order> 与 <Customer> 元素之间的层次结构,其中 <Order> 是父元素,<Customer> 是子元素。
<sql:relationship> 标记用于指定父子关系。<sql:relationship> 标记将 CustomerID 标识为 Sales.SalesOrderHeader 表中的 foreign-key,引用 Sales.Customer 表中的 CustomerID 键。<sql:relationship> 中提供的信息不足以唯一标识父表 (Sales.SalesOrderHeader) 中的行。因此,如果不采用 sql:key-fields,生成的层次结构将不正确。
如果对 <Order> 指定 sql:key-fields,则该批注可唯一标识父表 (Sales.SalesOrderHeader) 中的行,以及位于父元素之下的子元素。
架构如下:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Customer" sql:relation="Sales.Customer">
<AttributeType name="CustomerID" />
<attribute type="CustomerID" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader"
sql:key-fields="SalesOrderID" >
<AttributeType name="SalesOrderID" />
<AttributeType name="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="CustomerID" />
<element type="Customer" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="CustomerID"
foreign-relation="Sales.Customer"
foreign-key="CustomerID" />
</element>
</ElementType>
</Schema>
测试此架构的工作示例
复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 KeyFieldsA-Xdr.xml。
复制以下模板,并将它粘贴到文本文件中。在保存 KeyFieldsA-Xdr.xml 的相同目录中将文件另存为 KeyFieldsA-XdrT.xml。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFieldsA-Xdr.xml"> /Order </sql:xpath-query> </ROOT>
为映射架构 (KeyFieldsA-Xdr.xml) 指定的目录路径是保存模板的目录的相对路径。也可以指定绝对路径,例如:
mapping-schema="C:\MyDir\KeyFieldsA-Xdr.xml"
创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。
下面是结果集:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<Order SalesOrderID="43659" CustomerID="676">
<Customer CustomerID="676" />
</Order>
<Order SalesOrderID="43660" CustomerID="117">
<Customer CustomerID="117" />
</Order>
<Order SalesOrderID="43661" CustomerID="442">
<Customer CustomerID="442" />
</Order>
...
</ROOT>
B. 指定 sql:key-fields 在结果中生成正确的嵌套
在此架构中,未使用 <sql:relationship> 指定层次结构。此架构仍需指定 sql:key-fields 批注,以唯一标识 HumanResources.Employee 表中的雇员。
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Title" content="textOnly" >
<AttributeType name="EmployeeID" />
<attribute type="EmployeeID" />
</ElementType>
<ElementType name="HumanResources.Employee" sql:key-fields="EmployeeID" >
<element type="Title" />
</ElementType>
</Schema>
测试此架构的工作示例
复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 KeyFieldsB-Xdr.xml。
复制以下模板,并将它粘贴到文本文件中。在保存 KeyFieldsB-Xdr.xml 的相同目录中将文件另存为 KeyFieldsB-XdrT.xml。模板中的 XPath 查询返回所有 <Order> 元素。
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="KeyFieldsB-Xdr.xml"> /HumanResources.Employee </sql:xpath-query> </ROOT>
为映射架构 (KeyFieldsB-Xdr.xml) 指定的目录路径是保存模板的目录的相对路径。也可以指定绝对路径,例如:
mapping-schema="C:\MyDir\KeyFieldsB-Xdr.xml"
创建并使用 SQLXML 4.0 测试脚本 (Sqlxml4test.vbs) 执行该模板。
有关详细信息,请参阅使用 ADO 执行 SQLXML 4.0 查询。
下面是部分结果集:
<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>