使用 sql:key-fields 标识键列 (SQLXML 4.0)

适用于:SQL ServerAzure SQL 数据库

针对 XSD 架构指定 XPath 查询时,大多数情况下必须有键信息才能获得结果中的正确嵌套。 指定 sql:key-fields 注释是确保生成相应层次结构的一种方法。

注意

为了确保正确嵌套,建议为映射到表的元素指定 sql:key-fields 。 所生成的 XML 对于基础结果集的排序敏感。 如果未指定 sql:key-fields ,则生成的 XML 格式可能不正确。

sql:key-fields 的值标识唯一标识关系中行的列 () 。 如果需要多个列才能唯一标识某行,则用空格分隔列值。

当元素包含<在元素和子元素之间定义的 sql:relationship>,但不提供父元素中指定的表的主键时,必须使用 sql:key-fields 注释。

示例

若要创建使用以下示例的工作示例,必须满足某些要求。 有关详细信息,请参阅 运行 SQLXML 示例的要求

A. 当 sql:relationship> 未提供足够的信息时<生成适当的嵌套

此示例显示必须指定 sql:key-fields 的位置。

请考虑以下架构。 架构指定 Order> 和 Customer 元素之间的层次结构,<其中 <Order> 元素是父元素,<Customer> 元素是子元素。><

<sql:relationship> 标记用于指定父子关系。 它将 Sales.SalesOrderHeader 表中的 CustomerID 标识为父键,该父键引用 Sales.Customer 表中的 CustomerID 子键。 sql:relationship> 中<提供的信息不足以唯一标识父表中的行 (Sales.SalesOrderHeader) 。 因此,如果没有 sql:key-fields 注释,生成的层次结构将不准确。

Order> 上<指定 sql:key-fields 后,批注唯一标识父 (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>  
创建此架构的工作示例
  1. 复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 KeyFields1.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。 在保存 KeyFields1.xml 的相同目录中将该文件另存为 KeyFields1T.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"  
    
  3. 创建并使用 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>  
创建此架构的工作示例
  1. 复制上面的架构代码,并将它粘贴到文本文件中。 将文件另存为 KeyFields2.xml。

  2. 复制以下模板,并将它粘贴到文本文件中。 在保存 KeyFields2.xml 的相同目录中将该文件另存为 KeyFields2T.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"  
    
  3. 创建并使用 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>