使用 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. 複製下列範本,並將它貼到文字檔中。 將檔案儲存為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"  
    
  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. 複製下列範本,並將它貼到文字檔中。 將檔案儲存為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"  
    
  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>