使用 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>

测试此架构的工作示例

  1. 复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 KeyFieldsA-Xdr.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 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"
    
  3. 创建并使用 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>

测试此架构的工作示例

  1. 复制上面的架构代码,并将它粘贴到文本文件中。将文件另存为 KeyFieldsB-Xdr.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。在保存 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"
    
  3. 创建并使用 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>